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

How does boost::optional<> handle local variables?

本文关键字:处理 局部变量 optional lt gt boost 何处理      更新时间:2023-10-16

考虑一段这样的代码:

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;
}

显然,在将局部变量b分配给m_b后,a.m_b仍然有效存在。

这让我感到困惑,因为我认为将对象分配给boost::optional<>只是分配指向该对象的地址。由于在我的示例中,该对象是b,它是一个局部变量,因此在函数f()完成后,它的地址应该是无效的。

那为什么a.m_b还活着呢?它应该指向无效的地址。

boost::optionaloperator=将调用B的复制构造函数。如果将其插入到struct B则可以在其上设置断点以查看发生了什么:

B(B const& other)
{
}

Boost 在其实现中使用了新的放置位置,也许这就是让您感到困惑的地方?