c++ templates language-lawyer grammar declaration

¿Es `template<nombreDeEquipo>;` legal C++?



templates language-lawyer (2)

GCC y Clang no están de acuerdo sobre si la template<typename>; Es una declaración válida en C ++ a nivel global.

Espero que no se permita en el estándar de C ++ porque la templatización se refiere a las declaraciones de declaración, no a las declaraciones de expresión y, en consecuencia, tampoco a las declaraciones nulas (la declaración ; ).

Entonces, ¿es esto un error en Clang?


Es el comportamiento idiosincrásico de clang que ha existido durante mucho tiempo: las declaraciones que faltan generan solo una advertencia. Es igual que esto:

int;

g ++ mostraría un error, mientras que clang solo mostrará una advertencia. Esto no contradice el estándar.

advertencia: la declaración no declara nada [-Disposiciones de envío]

-Werror=missing-declarations pone las cosas en orden.


Realmente no. El estándar explícitamente no permite tal declaración en [temp]p2 ;

La declaración en una plantilla de declaración (si la hubiere) deberá

  • declarar o definir una función, una clase o una variable, o

  • definir una función miembro, una clase miembro, una enumeración miembro o un miembro de datos estáticos de una plantilla de clase o de una clase anidada dentro de una plantilla de clase, o

  • definir una plantilla miembro de una clase o plantilla de clase, o

  • ser una guía de deducción , o

  • Ser una declaración de alias .

Una declaración vacía no coincide con ninguna de esas cláusulas. Ahora el estándar dice que se requiere una implementación para emitir un mensaje de diagnóstico por cualquier violación de sus reglas, como esta. Tenga en cuenta que dice diagnóstico , no especifica si se emite una advertencia o un error (o incluso una nota). El compilador puede proporcionar extensiones que hacen que lo que escribiste sea válido, ya que no cambiaría el significado de un programa bien formado.

Así que no, ambos tienen razón. Sin embargo, el comportamiento de Clang se debe a una extensión, no a algo que el estándar especifique.