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 に答える