C++ 隐式复制构造函数成员变量复制排序

C++ implicit copy constructor member variable copy ordering

提问人:Lajos Nagy 提问时间:4/22/2020 最后编辑:songyuanyaoLajos Nagy 更新时间:4/22/2020 访问量:188

问:

只是想仔细检查:C++ 标准保证成员变量按隐式复制构造函数的声明顺序复制,对吗?在下面的例子中,被复制到之前,对吧?(假设两者都具有非平凡的复制构造函数,并且在复制之前复制正确性很重要。abABab

struct Foo {
  A a;
  B b;
};

我感兴趣的是它是否由标准保证或取决于实施?

C++ 初始化 语言-律师 复制构造函数

评论

1赞 aschepler 4/22/2020
事实上,对于所有可能的类初始化,基和成员的初始化顺序都是完全定义的,并且是相同的(直接成员按声明顺序排列):用户定义的构造函数、显式默认的构造函数、隐式声明的构造函数、继承的构造函数或聚合初始化。
0赞 aschepler 4/22/2020
或者也许不适用于某些继承的构造函数?这可能是一个奇怪的情况。

答:

4赞 songyuanyao 4/22/2020 #1

是的,对于隐式定义的复制构造函数,可以保证初始化顺序:

对于非联合类类型(class 和 struct),构造函数将执行 对象的基和非静态成员的完整成员副本,在 它们的初始化顺序,使用直接初始化。

数据成员的初始化顺序是其声明的顺序。

3)然后,按照类定义中声明的顺序初始化非静态数据成员。

从标准,[class.copy.ctor]/14

(强调我的)

非联合类 X 的隐式定义的复制/移动构造函数 执行其基和成员的逐成员复制/移动。[ 注: 非静态数据成员的默认成员初始值设定项将被忽略。 另请参阅 [class.base.init] 中的示例。— 尾注 ] 的顺序 初始化与碱基的初始化顺序相同,并且 用户定义构造函数中的成员(请参见 [class.base.init])。

[class.base.init]/13.3

然后,非静态数据成员按其初始化顺序进行初始化 在类定义中声明(同样,无论 mem-initializer 的顺序如何)。