类似的问题被问到here,但没有得到正确答案。
以下是否合法?
struct B;
struct A
{
A(B& b) : b(b)
{
}
B& b;
};
struct B
{
B(A& a) : a(a)
{
}
A& a;
};
struct C
{
C() : a(b), b(a)
{
}
A a;
B b;
};
我想知道它是否属于3.8(6)(C ++ 2003)
...在对象的生命周期开始之前但在存储之后 对象将占用的对象将被分配,或者在生命周期之后 一个对象已经结束并且在存储对象之前 占用被重用或释放,任何左值引用 可以使用原始对象,但仅限于有限的方式。这样的左值 指分配存储(3.7.3.2),并使用的属性 不依赖于其值的左值是明确定义的。
答案 0 :(得分:0)
完全合法。显然,A和B的存储被分配为在构造C之前分配C ...因此对A和B的引用是明确定义的并且可以使用。但是,您将无法在A对象的构造函数中取消引用B对象。相反,在B 的构造函数中引用A应该可以,尽管编译器支持任何一个可能是参差不齐...