只想重复检查: C++标准保证成员变量按照隐式复制构造函数的声明顺序复制,对吗?在下面的示例中,a是在b之前复制的,对吗?(假设A和B都有非平凡的复制构造函数,并且在复制a之前复制a对正确性非常重要。)
struct Foo {
A a;
B b;
};我感兴趣的是它是否得到了标准的保证,还是它依赖于实现?
发布于 2020-04-22 04:25:03
是的,隐式定义的复制构造函数保证了初始化顺序。
对于非联合类类型(类和结构),构造函数使用直接初始化按照初始化顺序对对象的基和非静态成员执行完整的成员级复制。
数据成员的初始化顺序是它们声明的顺序。
3)然后,根据类定义中的声明顺序初始化非静态数据成员。
从标准来看,[class.copy.ctor]/14
(强调地雷)
非联合类X的隐式定义复制/移动构造函数执行其基和成员的成员级复制/移动。[注意:忽略非静态数据成员的默认成员初始化项。还请参阅class.base.init中的示例。初始化的顺序与用户定义的构造函数中基和成员的初始化顺序相同(参见[class.base.init])。
然后,按照类定义中声明的顺序初始化非静态数据成员(同样不考虑https://timsong-cpp.github.io/cppwp/class.base.init#nt:mem-initializer的顺序)。
https://stackoverflow.com/questions/61357266
复制相似问题