以下定义明确吗?
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的完整示例。
只要A
和B
的构造函数对它们获得的引用没有任何作用,它是否安全/定义良好?
答案 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
的成员或基类,那么你的案例中的行为是明确定义的。