我已经尝试过了。代码:
null
输出为:
#include <iostream>
struct A
{
A() { std::cout << "1"; }
A(const A&) { std::cout << "2"; }
A(A&&) { std::cout << "3"; }
};
struct B
{
B() { std::cout << "4"; }
B(const B& b) : a(b.a) { std::cout << "5"; }
B(B&& b) : a(b.a) { std::cout << "6"; }
A a;
};
int main()
{
B b1;
std::cout << "END OF b1" << std::endl;
B b2 = std::move(b1);
}
我只是想知道为什么会这样,为什么将B的构造函数称为第二?我还尝试过使用类而不是struct,这是相同的行为。
答案 0 :(得分:4)
这是预期的行为。 initialization order被指定为
1)如果构造函数用于派生最多的类,则虚拟基数 类按照它们出现的顺序进行初始化 基类声明的深度优先从左到右遍历 (从左到右是指基本说明符列表中的外观)
2)然后,直接基类按从左到右的顺序初始化为 它们出现在此类的基本说明符列表中
3)然后,按以下顺序初始化非静态数据成员 类定义中的声明。
4)最后,执行构造函数的主体
然后总是在执行a
的构造函数(步骤#4)之前初始化数据成员B
(步骤#3)。