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
?