È necessaria una diagnostica per i modelli di membri inutilizzati con parametri di modello predefiniti non validi?

Aug 19 2020

Considera il seguente modello di classe:

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

È mal formato per istanziare Scon template parameters T, per il quale auto = T()è mal formato?

int main()
{
    S<int> a;    // ok
    S<int&> b;   // error
    S<int()> c;  // gcc ok, clang error
}

Questo sembra essere il caso, ma il problema è con c, dove Sviene istanziato con un tipo di funzione. gcc va bene con questo, mentre clang dice:

error: cannot create object of function type 'int ()'

che ha senso. Poiché gcc diagnostica l'istanza con int&, sospetto che si tratti di un bug di gcc. È giusto o non è richiesta una diagnostica per questo codice ?

Risposte

1 LanguageLawyer Aug 19 2020 at 14:10

Questo è CWG1635 :

1635. Quanto sono simili gli argomenti predefiniti del modello agli argomenti predefiniti della funzione?

Gli argomenti della funzione predefinita vengono istanziati solo quando necessario. Lo stesso vale per gli argomenti del modello predefinito? Ad esempio, il seguente è ben formato?

 #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);
 }

Inoltre, l'effetto sulla ricerca è lo stesso? Per esempio,

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