variable c++ c++11 static-members

c++ - variable - Mezcla constexpr declaraciones y const definiciones.



c++ static variable (1)

Su código está bien formado. El constexpr no es en sí mismo parte del tipo, pero agrega const ([dcl.constexpr] / 9), que está presente en su segunda declaración. Aunque las diferentes declaraciones de una función (o plantilla de función) tienen que estar de acuerdo en constexpr según [dcl.constexpr] / 1, no existe tal regla para las declaraciones de variables.

Vea el error #58541 , que básicamente usa su ejemplo.

Me encontré con la siguiente situación:

struct Foo { static constexpr char s[] = "Hello world"; }; const char Foo::s[];

Este fragmento de código se compila con Clang 3.7 (con -std=c++11 y -std=c++14 ), pero GCC (4.8, 6.0, configuración del mismo idioma) da el error que hubiera esperado:

GCC 4.8:

in.cpp:6:19: error: redeclaration ‘Foo::s’ differs in ‘constexpr’ const char Foo::s[]; ^ in.cpp:3:27: error: from previous declaration ‘Foo::s’ static constexpr char s[] = "Hello world"; ^ in.cpp:6:19: error: declaration of ‘constexpr const char Foo::s [12]’ outside of class is not definition [-fpermissive] const char Foo::s[];

GCC 6.0:

‘constexpr’ needed for in-class initialization of static data member ‘const char Foo::s [12]’ of non-integral type [-fpermissive]

Encontré esta vieja pregunta que parece discutir la mezcla de constexpr y const , pero se centra en si los inicializadores son expresiones constantes, más bien en si la definición y la declaración pueden diferir con respecto a la constancia.

¿Se permite proporcionar la definición de un miembro de datos estáticos constexpr T como const T ?