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

时间:2015-04-22 21:30:47

标签: 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 */ }
}

ideone.com的完整示例。

只要AB的构造函数对它们获得的引用没有任何作用,它是否安全/定义良好?

1 个答案:

答案 0 :(得分:2)

N4140 [class.cdtor] / 1读取:

  

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

虽然这段经文本身并不意味着行为是明确定义的,但下面的例子表明它是。这是一段摘录:

struct B : public A { int j; Y y; }; // non-trivial
extern B bobj;
B* pb = &bobj; // OK

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