Visual Studio 2017允许在构造函数中使用自身初始化引用成员。 C ++真的合法吗?

时间:2019-07-09 16:19:28

标签: c++ c++17

我刚刚在代码中发现了一个非常危险的错误,我认为它应该已经被编译器捕获了。我错了吗? 本质上,允许类的引用成员自己在构造函数中初始化。这是在Visual Studio 2017中编译且没有错误或警告的测试代码:

struct foo
{
    foo() : reference(reference) {}

    int& reference;
};

int main()
{
    foo fooOb;
}

更新:我看到这里有2009年的类似问题。其他编译器在2017年的表现是否相同,还是VS 2017问题?如果他们这样做的话,那似乎在向我暗示这是合法的C ++,但我不知道这是怎么回事。

2 个答案:

答案 0 :(得分:3)

  

其他编译器在2017年的表现是否相同,还是VS 2017问题?

撰写本文时:

  • GCC和Clang都发出警告,分别带有-Winit-self-Wuninitialized

  • MSVC和ICC均未发出警告。

  

如果他们这样做的话,那似乎在向我暗示这是合法的C ++,但我不知道这怎么可能。

从某种意义上讲,不需要编译器使编译失败就可以了,但这绝不是您想要的,因为您将触发UB。

答案 1 :(得分:2)

MSVC 2017收益:

  

警告C26495:变量'foo :: reference'未初始化。始终初始化成员变量(类型6)

您可能需要通过转到项目属性->代码分析(/分析)来启用代码分析