Este truco solo funciona para expresiones constantes de tiempo de compilación. Consideremos el siguiente ejemplo:
#include <iostream>
class Foo {
public:
static const int bar = 0;
};
int main()
{
std::cout << Foo::bar << endl;
}
Funciona muy bien, porque el compilador sabe que Foo::bar
es 0 y nunca cambia. Por lo tanto, optimiza todo el asunto.
Sin embargo, todo el asunto se rompe una vez que tome la dirección de esa variable como esto:
int main()
{
std::cout << Foo::bar << " (" << &Foo::bar << ")" << std::endl;
}
Enlazador le envía a fijar el programa debido a las constantes de tiempo de compilación no tienen direcciones.
Ahora, el segundo caso en su ejemplo no funciona simplemente porque una variable no constante no puede ser una expresión constante en tiempo de compilación. Por lo tanto, debe definirlo en algún lugar y no puede asignar ningún valor en la inicialización.
C++ 11, por cierto, tiene constexpr
. Puede consultar el wiki de Generalized constant expressions (o el estándar C++ 11 :-)) para obtener más información.
Además, tenga cuidado: con algunas cadenas de herramientas nunca podrá vincular el programa como se indica en el primer ejemplo cuando las optimizaciones están desactivadas, incluso si nunca toma una dirección de esas variables. Creo que hay una macro BOOST_STATIC_CONSTANT
en Boost para evitar este problema (aunque no estoy seguro de si funciona, porque creo que he visto errores de vinculación con algunos gcc antiguos incluso con esa macro).
posible duplicado de [Definición de miembros estáticos en C++] (http://stackoverflow.com/questions/3536372/defining-static-members-in-c) –
Esto podría ayudar: http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral-static-const-member-in-a-class –
@Uku Loskit Realmente no respondieron la segunda parte, todavía no entiendo la lógica Detrás de eso. – rubixibuc