我刚刚在代码中发现了一个非常危险的错误,我认为它应该已经被编译器捕获了。我错了吗? 本质上,允许类的引用成员自己在构造函数中初始化。这是在Visual Studio 2017中编译且没有错误或警告的测试代码:
struct foo
{
foo() : reference(reference) {}
int& reference;
};
int main()
{
foo fooOb;
}
更新:我看到这里有2009年的类似问题。其他编译器在2017年的表现是否相同,还是VS 2017问题?如果他们这样做的话,那似乎在向我暗示这是合法的C ++,但我不知道这是怎么回事。
答案 0 :(得分:3)
其他编译器在2017年的表现是否相同,还是VS 2017问题?
撰写本文时:
GCC和Clang都发出警告,分别带有-Winit-self
和-Wuninitialized
。
MSVC和ICC均未发出警告。
如果他们这样做的话,那似乎在向我暗示这是合法的C ++,但我不知道这怎么可能。
从某种意义上讲,不需要编译器使编译失败就可以了,但这绝不是您想要的,因为您将触发UB。
答案 1 :(得分:2)
MSVC 2017收益:
警告C26495:变量'foo :: reference'未初始化。始终初始化成员变量(类型6)
您可能需要通过转到项目属性->代码分析(/分析)来启用代码分析