C++ odr used规则不适用于visual studio

C++ odr used规则不适用于visual studio,c++,c++11,one-definition-rule,C++,C++11,One Definition Rule,根据报告: 非正式地说,如果一个对象的值被读取(除非它是编译时常量)或写入,它的地址被获取,或者引用被绑定到它,那么它就是odr。。。。。如果使用odr对象、引用或函数,则其定义必须存在于程序中的某个位置违反此规则通常是链接时间错误。 但在visual studio 2015中: #include <iostream> using namespace std; class A{ public: static const int k=666; }; int main() {

根据报告:

非正式地说,如果一个对象的值被读取(除非它是编译时常量)或写入,它的地址被获取,或者引用被绑定到它,那么它就是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;
}
#包括
使用名称空间std;
甲级{
公众:
静态常数int k=666;
};
int main(){
const int&s=A::k;//没有警告?未定义的行为?
cout:

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

我的重点。

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


强调我的。

那么,是不是一个格式错误的代码段具有未定义的行为?@bigxiao这不完全是一回事。你的程序格式错误,没有任何UB。但是运行它无法保证你能得到什么。那么,是不是一个格式错误的代码段具有未定义的行为?@bigxiao这不完全是一回事。你的程序格式不好,没有任何UB。但运行它并不能保证您能得到什么。