ODR 使用的规则不适用于 Visual Studio

odr-used rule does not apply in visual studio

本文关键字:适用于 Visual Studio 不适用 规则 ODR      更新时间:2023-10-16

根据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:

每个

程序应只包含该程序中使用的每个非内联函数或变量的一个定义,而不是丢弃的语句;无需诊断

强调我的。