根据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,则需要类之外的定义
[basic.def.odr]p10:
每个程序应只包含该程序中使用的每个非内联函数或变量的一个定义,而不是丢弃的语句;无需诊断。
强调我的。