2013-06-19 94 views
0

有人问到类似的问题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

不知道这是有关你的问题,但在我看来就像该初始化列表'C'永远不会正常工作。初始化顺序取决于声明的顺序。 –

+2

我认为只要A和B构造函数只记住引用而不访问引用的对象,它们就会成功。我想这算“使用不依赖于它的价值的属性”。 – Medinoc

+1

对我来说似乎也是合法的。 – Massa

回答

0

完全合法。显然,A和B的存储是在构建C之前分配C的,因此对A和B的引用是明确定义的并且可以使用。但是,您无法在A对象的构造函数中取消引用B对象。相反,B中的构造deferencing A应是好的,但对任何的这种编译器的支持可能是参差不齐......

+0

对于微笑,我在VS2012中试过这个,它1)编译得很好,但出人意料地2)允许我在A的构造函数中抛弃B,导致访问未初始化的内存。 – mark