O padrão C ++ requer uma definição para seu membro const estático, se a definição for necessária de alguma forma.
A definição é necessária, por exemplo, se o endereço for usado. push_back
toma seu parâmetro por referência const e, portanto, estritamente o compilador precisa do endereço do seu membro e você precisa defini-lo no espaço para nome.
Quando você lança explicitamente a constante, cria um temporário e é esse temporário que é vinculado à referência (sob regras especiais no padrão).
Este é um caso realmente interessante e, na verdade, acho que vale a pena levantar uma questão para que o std seja alterado para ter o mesmo comportamento do seu membro constante!
Embora, de uma maneira estranha, isso possa ser visto como um uso legítimo do operador '+' unário. Basicamente, o resultado de unary +
é um rvalue e, portanto, as regras para vincular rvalues a referências const se aplicam e não usamos o endereço do nosso membro const estático:
v.push_back( +Foo::MEMBER );