Un diagnostic est-il requis pour les modèles de membre inutilisés avec des paramètres de modèle par défaut incorrects ?

Aug 19 2020

Considérez le modèle de classe suivant :

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

Est-il mal formé d'instancier Savec 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ù Sest 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

1 LanguageLawyer Aug 19 2020 at 14:10

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