Стандарт C ++ требует определения вашего статического константного члена, если определение каким-то образом необходимо.
Требуется определение, например, если используется его адрес. push_back
принимает свой параметр по константной ссылке, и поэтому строго компилятору нужен адрес вашего члена, и вам нужно определить его в пространстве имен.
Когда вы явно приводите константу, вы создаете временный объект, и именно этот временный объект привязывается к ссылке (в соответствии со специальными правилами в стандарте).
Это действительно интересный случай, и я на самом деле думаю, что стоит поднять проблему, чтобы изменить стандартное поведение, чтобы иметь то же поведение для вашего постоянного члена!
Хотя странным образом это можно рассматривать как законное использование унарного оператора '+'. В основном результат unary +
является rvalue, и поэтому применяются правила привязки rvalues к ссылкам const, и мы не используем адрес нашего статического члена const:
v.push_back( +Foo::MEMBER );