È necessaria una diagnostica per i modelli di membri inutilizzati con parametri di modello predefiniti non validi?
Considera il seguente modello di classe:
template<typename T>
struct S
{
template<auto = T()>
void f();
};
È mal formato per istanziare S
con 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 S
viene 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
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 {}; };