boost :: optional<>如何?处理局部变量?

时间:2012-05-04 13:23:37

标签: c++ boost scope global-variables

考虑一段这样的代码:

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还活着?它应该指向一个无效的地址。

1 个答案:

答案 0 :(得分:2)

boost::optional的{​​{1}}将调用operator=的复制构造函数。如果您将其插入到B中,则可以在其上设置断点以查看正在发生的情况:

struct B

Boost在其实现中使用了一个新的位置,也许这​​会让你感到困惑?