0

此处提出了类似的问题,但没有得到正确的答案。

以下是否合法?

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

4

1 回答 1

0

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

于 2013-06-19T12:33:04.833 回答