相互引用实例

时间:2013-06-19 09:33:27

标签: c++

类似的问题被问到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),并使用的属性   不依赖于其值的左值是明确定义的。

1 个答案:

答案 0 :(得分:0)

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