次のようなコードを考えてみましょう。
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生きているのでしょうか?無効なアドレスを指している必要があります。