0

次のようなコードを考えてみましょう。

struct B {
    int c;
    B() {
        c = 20;
    }
};
struct A {
    boost::optional<B> m_b;
    void f() {
        B b; 
        this->m_b = b;
    }
};

int main(void) {
    A a;
    a.f();
    cout << a.m_b->c << endl;
}

どうやら、ローカル変数をa.m_bに割り当てた後も、まだ有効に存在しています。bm_b

boost::optional<>オブジェクトを割り当てることは、オブジェクトを指すアドレスを割り当てることだと思っていたので、これは私を混乱させます。私の例では、そのオブジェクトはbローカル変数であるため、関数が完了するとそのアドレスは無効になるはずf()です。

では、なぜa.m_b生きているのでしょうか?無効なアドレスを指している必要があります。

4

1 に答える 1

2

boost::optionalはのコピー コンストラクターoperator=を呼び出します。Bこれを に挿入するstruct Bと、ブレークポイントを設定して何が起こっているかを確認できます。

B(B const& other)
{
}

Boost はその実装で新しい配置を使用しますが、これがあなたを混乱させているのではないでしょうか?

于 2012-05-04T13:40:39.980 に答える