Apakah diagnosis diperlukan untuk templat anggota yang tidak digunakan dengan parameter templat default yang tidak bagus?

Aug 19 2020

Pertimbangkan template kelas berikut:

template<typename T>
struct S 
{    
    template<auto = T()> 
    void f();
};

Apakah bentuknya buruk untuk dibuat Sdengan 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 Sdibuat 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

1 LanguageLawyer Aug 19 2020 at 14:10

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 {};
 };