¿Se requiere un diagnóstico para las plantillas de miembros no utilizadas con parámetros de plantilla predeterminados mal formados?

Aug 19 2020

Considere la siguiente plantilla de clase:

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

¿Está mal formado para instanciar Scon parámetros de plantilla T, para lo cual auto = T()está mal formado?

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

Este parece ser el caso, pero el problema es con c, donde Sse crea una instancia con un tipo de función. gcc está de acuerdo con esto, mientras que clang dice:

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

lo que tiene sentido. Dado que gcc diagnostica la creación de instancias con int&, sospecho que se trata de un error de gcc. ¿Es así o no se requiere un diagnóstico para este código ?

Respuestas

1 LanguageLawyer Aug 19 2020 at 14:10

Este es CWG1635 :

1635. ¿Qué tan similares son los argumentos predeterminados de la plantilla a los argumentos predeterminados de la función?

Los argumentos de función predeterminados se instancian solo cuando es necesario. ¿Ocurre lo mismo con los argumentos de plantilla predeterminados? Por ejemplo, ¿está bien formado lo siguiente?

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

Además, ¿el efecto en la búsqueda es el mismo? P.ej,

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