c++ - 为什么初始化程序列表顺序必须与成员声明顺序匹配?

标签 c++ constructor initializer-list

如果初始值设定项列表顺序与类中的变量顺序不匹配,为什么gcc会发出嘶嘶声适合?

class myClass
{
public:
   int A;
   int B;
   myClass();
};

myClass::myClass() :
B(1),
A(2)
{}

将导致:
file.h:274: warning: 'myClass::A' will be initialized after
file.h:273: warning:   'int myClass::B
file.cpp:581: warning:   when initialized here

发出此类警告是否有任何特定原因?是否有与按类别定义的顺序不同的类别变量初始化相关的风险?

(请注意,有一个a question涉及到该主题,但是答案几乎是“因为它应该是这样”,而没有给出为什么应该订购它的任何理由,或者这是有问题的-我想知道为什么存在这样的限制-有人可以举例说明它可能适得其反吗?)

最佳答案

该警告试图防止出现您可能依赖于数据成员错误顺序的情况。假设您认为B在A之前被初始化,然后执行以下操作:

myClass::myClass() :
B(42), A(B) {}

在这里,您有 undefined 的行为,因为您正在从未初始化的B中读取。

关于c++ - 为什么初始化程序列表顺序必须与成员声明顺序匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59587039/

相关文章:

c++ - 没有匹配函数调用 ‘X::X()’

c++ - 局部变量如何隐藏全局变量

c++ - STL 排序对字符串 vector 与字符串指针 vector 的性能比较

c++ - Visual Studio 2005 在编译期间忽略预处理器指令

Java:继承类构造函数正在调用父类(super class)

c++ - 为什么将这些 C++ header 指定为包含 <initializer_list>?

c++ - 如何将值插入到特定索引处的 C++ boost::multiindex 集合中,如 std::list

Javascript/Node Js - 为每个实例创建新变量

c++ - 调用 std::map operator[] 或插入时会发生什么

java - list.add(object) 和 list<obj> java 中的错误