【问题标题】:C++ implicit copy constructor member variable copy orderingC++隐式复制构造函数成员变量复制排序
【发布时间】:2020-08-05 00:14:24
【问题描述】:

只是想仔细检查一下:C++ 标准保证成员变量按声明的顺序被 implicit 复制构造函数复制,对吗?在下面的示例中,ab 之前被复制,对吗? (假设AB 都有重要的复制构造函数,并且在复制b 之前复制a 对正确性很重要。)

struct Foo {
  A a;
  B b;
};

我感兴趣的是它是由标准保证还是依赖于实现?

【问题讨论】:

  • 事实上,对于所有可能的类初始化,基类和成员的初始化顺序是完全定义的并且相同(直接成员按声明顺序):用户定义的构造函数,显式默认构造函数,隐式声明的构造函数、继承的构造函数或聚合初始化。
  • 或者可能不适用于某些继承的构造函数?这可能是一个奇怪的案例。

标签: c++ initialization language-lawyer copy-constructor


【解决方案1】:

是的,保证implicitly-defined copy constructor的初始化顺序:

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

data members的初始化顺序就是它们的声明顺序。

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

来自标准,[class.copy.ctor]/14

(强调我的)

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

[class.base.init]/13.3

然后,非静态数据成员按照它们的顺序初始化 在类定义中声明(同样不管 mem-initializers)。

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多