考虑一段这样的代码:
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
还活着?它应该指向一个无效的地址。
答案 0 :(得分:2)
boost::optional
的{{1}}将调用operator=
的复制构造函数。如果您将其插入到B
中,则可以在其上设置断点以查看正在发生的情况:
struct B
Boost在其实现中使用了一个新的位置,也许这会让你感到困惑?