Visual Studio 2017 允许在构造函数中使用自身初始化引用成员.真的是合法的C++吗?
Visual Studio 2017 allows a reference member to be initialized with itself in the constructor. Is it really legal 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。
MSVC 2017 产生:
警告 C26495:变量"foo::reference"未初始化。始终初始化成员变量(类型.6(
可能需要通过转到项目属性 ->代码分析 (/analyze( 来启用代码分析
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- Visual Studio 2017 允许在构造函数中使用自身初始化引用成员.真的是合法的C++吗?
- 关键部分或静音是否真的是成员变量,或者何时应成为成员变量
- 不要使用 "const char *" 作为类的成员,如果你真的是"std::string"
- 我真的必须取消移动构造函数/移动结构中的所有成员还是只是指针
- 在按值传递的重成员的构造函数初始化列表中是否真的需要std::move ?
- 子类真的继承私有成员变量吗?