El estándar de C++ requiere una definición para su miembro static const si la definición es de alguna manera necesaria.
La definición es obligatoria, por ejemplo, si se usa su dirección. push_back
toma su parámetro por referencia const, y tan estrictamente el compilador necesita la dirección de su miembro y necesita definirlo en el espacio de nombres.
Cuando publica explícitamente la constante, está creando una temporal y es esta temporal la que está vinculada a la referencia (bajo reglas especiales en el estándar).
Este es un caso realmente interesante, y de hecho creo que vale la pena plantear un problema para que el estándar se cambie para tener el mismo comportamiento para su miembro constante.
Aunque, de una manera extraña, esto podría ser visto como un uso legítimo del operador unario '+'. Básicamente el resultado de la unary +
es un valor de lado derecho y por lo que las reglas para la unión de rvalues a const aplican referencias y no usamos la dirección de nuestro método constante estática:
v.push_back(+Foo::MEMBER);
He editado la pregunta para sangrar el código por cuatro espacios en lugar de usar
. Esto significa que los corchetes angulares no se interpretan como HTML. –aplausos :) regla de 10 caracteres min es a veces molesto;) –