Стандарт C++ требует определения для вашего статического члена константы, если определение каким-то образом необходимо.
Данное определение требуется, например, если используется его адрес. push_back
принимает свой параметр с помощью ссылки const, и поэтому строгому компилятору нужен адрес вашего члена, и вам нужно определить его в пространстве имен.
Когда вы явно используете константу, вы создаете временную, и это временная привязка к ссылке (по специальным правилам в стандарте).
Это действительно интересный случай, и я действительно думаю, что стоит поднимать проблему, чтобы std изменился, чтобы иметь такое же поведение для вашего постоянного члена!
Хотя это странное поведение можно рассматривать как законное использование унарного оператора «+». В основном результат unary +
является Rvalue и поэтому правила для связывания rvalues на константные ссылки применяются, и мы не используем адрес нашего статического члена ПОСТОЯННОГО:
v.push_back(+Foo::MEMBER);
Я отредактировал вопрос, чтобы вставить код четырьмя пробелами вместо использования
. Это означает, что угловые скобки не интерпретируются как HTML. – 2008-11-07 19:03:01cheers :) 10 символов правило правило иногда раздражает;) – 2008-11-08 12:30:10