【问题标题】:How does boost::optional<> handle local variables?boost::optional<> 如何处理局部变量?
【发布时间】:2012-05-04 13:23:36
【问题描述】:

考虑这样一段代码:

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&lt;&gt; 只是分配指向该对象的地址。由于在我的示例中该对象是b,它是一个局部变量,因此在函数f() 完成后其地址应该是无效的。

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

【问题讨论】:

    标签: c++ boost scope global-variables


    【解决方案1】:

    boost::optionaloperator= 将调用B 的复制构造函数。如果你把它插入到你的struct B 中,你可以在它上面设置一个断点来看看发生了什么:

    B(B const& other)
    {
    }
    

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

    【讨论】:

    • 啊,我明白了。不知道它会复制。谢谢!
    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    相关资源
    最近更新 更多