ODR 使用的规则不适用于 Visual Studio
odr-used rule does not apply in visual studio
根据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:
每个程序应只包含该程序中使用的每个非内联函数或变量的一个定义,而不是丢弃的语句;无需诊断。
强调我的。
相关文章:
- 为什么它不适用于Visual 2019的原因
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 适用于 WebView2 旧版本的示例应用程序
- 如何在 CMake 中添加预编译标头用于 Visual Studio 生成器
- 智能感知不适用于Visual Studio 2017中的cmake项目
- WinDBG适用于从Visual Studio 2015保存的转储,但不适用于任务管理器。显示异常代码"not found"
- 适用于Visual Studio 2017的CMake Multi-Project设置
- Visual C++ 模板代码适用于 MSVC 2015,但不适用于 2017
- 在Visual Studio 2017上编译适用于Android的SDL2应用程序时缺少 libBox2D.so
- 试图在Visual Studio 6.0上编译PuTTY PSCP(适用于Windows)时出现C++错误RC2104
- 完全相同C++代码适用于Visual Studio,但不适用于Xcode
- Visual Studio 2010 与 2012 编译时性能和稳定性比较,适用于C++用户
- 正在安装适用于Visual Studio的C/C++的openCV 2.4
- GCC 奇怪的链接器错误.适用于Visual Studio 2010
- 模板专用化适用于 gcc,但不适用于 Visual Studio 10
- Xcode 6 的 Playground 功能适用于 Visual Studio 或其他使用 C++ 的 IDE?
- 链接到C++中的DLL——同样的代码适用于Visual Studio,但不适用于MinGW
- 适用于Microsoft Visual C++2008和R2007b的Mex类型