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 回答