El estándar C ++ requiere una definición para su miembro const estático si la definición es de alguna manera necesaria.
Se requiere la definición, por ejemplo, si se utiliza su dirección. push_back
toma su parámetro por referencia constante, por lo que estrictamente el compilador necesita la dirección de su miembro y usted debe definirla en el espacio de nombres.
Cuando expulsa explícitamente la constante, está creando un temporal y es este temporal el que está vinculado a la referencia (bajo reglas especiales en el estándar).
Este es un caso realmente interesante, y realmente creo que vale la pena plantear un problema para que se cambie el estándar para que tenga el mismo comportamiento para su miembro constante.
Aunque, de una manera extraña, esto podría verse como un uso legítimo del operador unario '+'. Básicamente, el resultado de unary +
es un valor r y, por lo tanto, se aplican las reglas para vincular los valores r con las referencias constantes y no utilizamos la dirección de nuestro miembro constante estático:
v.push_back( +Foo::MEMBER );