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

Visual Studio 2017 allows a reference member to be initialized with itself in the constructor. Is it really legal C++?

本文关键字:真的 成员 引用 C++ 初始化 2017 Studio 构造函数 Visual      更新时间:2023-10-16

我刚刚在我的代码中发现了一个非常危险的错误,我觉得它应该被编译器捕获。我错了吗?实质上,允许在构造函数中自行初始化类的引用成员。下面是在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。

MSVC 2017 产生:

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

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