В соответствии с определением odr-used
:
Неформально объект используется в odr, если его значение читается (если только оно не является постоянной времени компиляции) илизаписано, взят его адрес или привязана ссылка; ..... Если используется объект, ссылка или функция odr, его определение должно существовать где-то в программе; нарушение, которое обычно является ошибкой во время соединения.
Но здесь, в Visual Studio 2015:
#include <iostream>
using namespace std;
class A{
public:
static const int k=666;
};
int main() {
const int&s=A::k;//no warning?undefined behavior?
cout << &A::k << endl;//no warning,no error?
return 0;
}
Согласно cppref:
требуется определение вне класса, если оно используется odr