Dalam contoh berikut, argumen fungsi digunakan untuk menguji dengan ekspresi yang membutuhkan apakah ekspresi yang menggunakannya terbentuk dengan baik. Ekspresi yang membutuhkan tidak membutuhkan argumen; menggunakan variabel dalam lingkup fungsi secara langsung:
#include <cstddef>
#include <vector>
template<typename T>
void Resize(T &v, std::size_t const n)
{
if constexpr (requires { v.resize(n); })
v.resize(n);
}
template<typename T>
void Eziser(T &v, std::size_t const n)
{
if constexpr (requires { v.eziser(n); })
v.eziser(n);
}
int main()
{
std::vector<int> v;
Resize(v, 10u);
Eziser(v, 10u);
}
Kode di atas mengkompilasi dengan cabang konsep Dentang. Namun, GCC10 hanya menerima panggilan ke Resize
. ICE GCC9. Apakah Dentang benar menerimanya?
c++
c++20
c++-concepts
kotak logam
sumber
sumber
Resize
danEziser
harus ditolak) atau kedua fungsi harus dikompilasi. Saya akan mengatakan dentang benar.Jawaban:
Ya, membutuhkan-ekspresi dapat menggunakan apa pun yang ada dalam ruang lingkup. Lagi pula, ia hanya membutuhkan jenis apa pun yang ia sebutkan, kecuali dalam persyaratan bersarang atau ekspresi konstan lainnya. Itu berlaku untuk deklarasi yang mengelilinginya seperti parameternya sendiri (formal).
[expr.prim.req] / 5 :
sumber