Un diagnostic est-il requis pour les modèles de membre inutilisés avec des paramètres de modèle par défaut incorrects ?
Considérez le modèle de classe suivant :
template<typename T>
struct S
{
template<auto = T()>
void f();
};
Est-il mal formé d'instancier S
avec des paramètres de modèle T
, pour lesquels auto = T()
est mal formé ?
int main()
{
S<int> a; // ok
S<int&> b; // error
S<int()> c; // gcc ok, clang error
}
Cela semble être le cas, mais le problème est avec c
, où S
est instancié avec un type de fonction. gcc est d'accord avec ça, tandis que clang dit :
error: cannot create object of function type 'int ()'
qui a du sens. Étant donné que gcc diagnostique l'instanciation avec int&
, je soupçonne qu'il s'agit d'un bogue de gcc. Est-ce exact ou un diagnostic n'est-il pas nécessaire pour ce code ?
Réponses
C'est CWG1635 :
1635. Dans quelle mesure les arguments par défaut du modèle sont-ils similaires aux arguments par défaut de la fonction ?
Les arguments de fonction par défaut sont instanciés uniquement lorsque cela est nécessaire. Est-ce la même chose pour les arguments de modèle par défaut ? Par exemple, est-ce que ce qui suit est bien formé ?
#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); }
En outre, l'effet sur la recherche est-il le même ? Par exemple,
struct S { template<typename T = U> void f(); struct U {}; };