首页 > 解决方案 > Visual Studio 2017 允许在构造函数中使用自身初始化引用成员。它真的是合法的 C++ 吗?

问题描述

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

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

    int& reference;
};

int main()
{
    foo fooOb;
}

更新:我看到这里有一个 2009 年的类似问题。其他编译器在 2017 年的行为是否相同,还是 VS 2017 的问题?如果他们这样做了,这对我来说有点暗示这是合法的 C++,但我不明白它是怎么回事。

标签: c++c++17

解决方案


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

当时写的是:

  • GCC 和 Clang 都分别用-Winit-self和发出警告-Wuninitialized

  • MSVC 和 ICC 都没有对此发出警告。

如果他们这样做了,这对我来说有点暗示这是合法的 C++,但我不明白它是怎么回事。

从某种意义上说,编译器不需要编译失败是合法的,但这绝不是你想要的,因为你会触发 UB。


推荐阅读