次のようなコードを考えてみましょう。
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
に割り当てた後も、まだ有効に存在しています。b
m_b
boost::optional<>
オブジェクトを割り当てることは、オブジェクトを指すアドレスを割り当てることだと思っていたので、これは私を混乱させます。私の例では、そのオブジェクトはb
ローカル変数であるため、関数が完了するとそのアドレスは無効になるはずf()
です。
では、なぜa.m_b
生きているのでしょうか?無効なアドレスを指している必要があります。