c++ - Visual Studio 2017 允许在构造函数中使用自身初始化引用成员。它真的是合法的 C++ 吗?
问题描述
我刚刚在我的代码中发现了一个非常危险的错误,我觉得它应该被编译器捕获。我错了吗?本质上,类的引用成员是允许在构造函数中自己初始化的。这是在 Visual Studio 2017 中编译的测试代码,没有错误或警告:
struct foo
{
foo() : reference(reference) {}
int& reference;
};
int main()
{
foo fooOb;
}
更新:我看到这里有一个 2009 年的类似问题。其他编译器在 2017 年的行为是否相同,还是 VS 2017 的问题?如果他们这样做了,这对我来说有点暗示这是合法的 C++,但我不明白它是怎么回事。
解决方案
其他编译器在 2017 年的行为是否相同,还是 VS 2017 的问题?
当时写的是:
GCC 和 Clang 都分别用
-Winit-self
和发出警告-Wuninitialized
。MSVC 和 ICC 都没有对此发出警告。
如果他们这样做了,这对我来说有点暗示这是合法的 C++,但我不明白它是怎么回事。
从某种意义上说,编译器不需要编译失败是合法的,但这绝不是你想要的,因为你会触发 UB。
推荐阅读
- jasmine - Jasmine超时时如何显示量角器的错误?
- css - React Native 中的提升
- java - 使用自定义对象存储 ArrayList
- c# - 方法 '' 没有重载需要 0 个参数
- raspberry-pi3 - Raspberry Pi 3 下载菜单未显示
- javascript - 隐藏没有此类别搜索结果的标题(类别)(javascript 搜索功能)
- php - 一个简单的 php 脚本不会一直返回相同大小的答案
- mongodb - 一些将数据插入 mongodb 的任务在火花流中需要很长时间
- mysql - 不能对本地声明的变量使用准备语句
- angular - Web 平台的社交共享在 ionic 3 中不起作用