构造函数调用序列

Edu*_*yan 3 c++ inheritance constructor virtual-inheritance language-lawyer

请考虑以下代码:

class A {};

class B : virtual public A {};

class C : virtual public A {};

class D : public B, public C {};

D d;
Run Code Online (Sandbox Code Playgroud)

Visual Studio的编译器首先调用类B的构造函数,然后调用类C的构造函数.但这是一个规则,即ISO C++标准是否保证构造函数调用的顺序?

T.C*_*.C. 8

这是有保证的.从N3797的§12.6.2[class.base.init]/p11开始:

在非委托构造函数中,初始化按以下顺序进行:

  • 首先,仅对于派生程度最高的类(1.8)的构造函数,虚拟基类按照它们出现在基类的有向无环图的深度优先从左到右遍历的顺序进行初始化,其中"左 - to-right"是派生类base-specifier-list中基类出现的顺序.
  • 然后,直接基类按声明顺序初始化,因为它们出现在base-specifier-list中(无论mem-initializers的顺序如何).
  • 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管mem-initializers的顺序如何).