构造函数初始化列表中的循环依赖

Cla*_*diu 5 c++ constructor initialization circular-dependency initialization-list

以下是明确界定的吗?

class A;
class B;

// define A, which takes B& in constructor
// define B, which takes A& in constructor

class C
{
    A a;
    B b;
public:
    C() : a(b), b(a) { /* stuff with a and b */ }
}
Run Code Online (Sandbox Code Playgroud)

ideone.com上的完整示例.

是否安全/定义良好,只要构造函数对于它们所获得的引用A并且B不做任何操作?

Ant*_*vin 2

N4140 [class.cdtor]/1 内容如下:

对于具有非平凡构造函数的对象,在构造函数开始执行之前引用该对象的任何非静态成员或基类会导致未定义的行为。对于具有非平凡析构函数的对象,在析构函数完成执行后引用该对象的任何非静态成员或基类会导致未定义的行为。

虽然这段文字本身并不意味着该行为是明确定义的,但以下示例表明它是明确定义的。以下是摘录:

struct B : public A { int j; Y y; }; // non-trivial
extern B bobj;
B* pb = &bobj; // OK
Run Code Online (Sandbox Code Playgroud)

所以答案是:是的,如果您没有b在 的构造函数中引用 的成员或基类,那么您的情况的行为是明确定义的A