2013-06-19 92 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