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