Suponiendo que N2116 es la redacción que se incorpora, entonces su ejemplo está mal formado (observe que el no hay concepto de "legal/ilegal" en C++). El texto propuesto para [decl.constexpr]/3 dice
- su función de cuerpo será un compuesto enunciado de la forma
{ return expression; }
donde la expresión es una expresión constante de potencial (5,19);
Su función viola el requisito de que también declara una variable local.
Editar: Esta restricción se puede superar moviendo num fuera de la función. La función todavía no sería bien formado, entonces, porque la expresión debe ser una expresión potencial constante, que se define como
Una expresión es una expresión constante potencial si es una constante expresión cuando todas las ocurrencias de parámetros de funciones se reemplazan por expresiones constantes arbitrarias del tipo apropiado.
IOW, reinterpret_cast<const unsigned char*> (&num)[0] == 0xDD
debería ser una expresión constante. Sin embargo, no es: &num
sería una expresión constante de dirección (5.19/4). Sin embargo, no se permite el acceso al valor de dicho puntero para una expresión constante:
El operador de suscripción [] y el acceso de miembro de clase. y operadores , &
y *
operadores unarios, y modelos de puntero (excepto dynamic_casts, 5.2.7) pueden usarse en la creación de una expresión constante de dirección , pero no se debe acceder al valor de un objeto mediante el uso de estos operadores.
Editar: El texto anterior es de C++ 98. Aparentemente, C++ 0x es más permisivo que lo que permite expresiones constantes.La expresión implica una conversión-lvalue a-valor p de la referencia de matriz, que está prohibido desde expresiones constantes a menos
que se aplica a un lvalue de tipo integral eficaz que se refiere a una variable const no volátil o estático miembro de datos inicializado con expresiones constantes
no es claro si (&num)[0]
"se refiere a" una variable const, o si solamente un literal num
"se refiere a" una variable de este tipo. Si (&num)[0]
se refiere a esa variable, entonces no está claro si reinterpret_cast<const unsigned char*> (&num)[0]
todavía "se refiere a" num
.
No creo que aplique, aquí. La variable estática es constante en sí misma. – GManNickG
La redacción en 4.1 de N2116 establece que el cuerpo de la función solo debe tener una declaración (que es la declaración de devolución). Eso sí, desde mi rápida mirada al texto, no veo nada que prohíba el código anterior si num está definido globalmente. – GRB
@GMan: como dice GRB, el borrador es bastante claro que debe tener solo una declaración, y una declaración * es * una declaración (C++ 98, 6.7, Declaración de declaración). @GRB: editaré mi respuesta para discutir mover la constante fuera de la función. –