Apakah diagnosis diperlukan untuk templat anggota yang tidak digunakan dengan parameter templat default yang tidak bagus?
Pertimbangkan template kelas berikut:
template<typename T>
struct S
{
template<auto = T()>
void f();
};
Apakah bentuknya buruk untuk dibuat S
dengan parameter templat T
, yang bentuknya buruk auto = T()
?
int main()
{
S<int> a; // ok
S<int&> b; // error
S<int()> c; // gcc ok, clang error
}
Tampaknya demikian, tetapi masalahnya adalah dengan c
, di mana S
dibuat instance-nya dengan jenis fungsi. gcc tidak masalah dengan ini, sementara clang mengatakan:
error: cannot create object of function type 'int ()'
yang masuk akal. Karena gcc mendiagnosis instantiasi dengan int&
, saya curiga ini adalah bug gcc. Apakah itu benar, atau apakah diagnosis tidak diperlukan untuk kode ini ?
Jawaban
Ini adalah CWG1635 :
1635. Seberapa mirip argumen default template dengan argumen default fungsi?
Argumen fungsi default dibuat hanya saat diperlukan. Apakah argumen template default juga sama? Misalnya, apakah yang berikut ini terbentuk dengan baik?
#include <type_traits> template<class T> struct X { template<class U = typename T::type> static void foo(int){} static void foo(...){} }; int main(){ X<std::enable_if<false>>::foo(0); }
Selain itu, apakah efeknya pada pencarian sama? Misalnya,
struct S { template<typename T = U> void f(); struct U {}; };