Стандарт C ++ вимагає визначення вашого статичного члена const, якщо визначення якимось чином необхідне.
Визначення потрібно, наприклад, якщо використовується його адреса. push_back
приймає його параметр за посиланням const, і так суворо компілятору потрібна адреса вашого члена, і вам потрібно визначити його в просторі імен.
Коли ви явно передаєте константу, ви створюєте тимчасову, і саме ця тимчасова пов'язана з посиланням (згідно спеціальних правил у стандарті).
Це справді цікавий випадок, і я насправді думаю, що варто поставити питання, щоб змінити std, щоб мати таку саму поведінку для вашого постійного члена!
Хоча, дивним чином, це можна розглядати як легітимне використання одинарного оператора "+". В основному результатом значення unary +
є оцінку, тому застосовуються правила прив'язки rvalues до const посилань, і ми не використовуємо адресу нашого статичного члена const:
v.push_back( +Foo::MEMBER );