boost::optional<>如何处理局部变量?
How does boost::optional<> handle local 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;
}
显然,在将局部变量b
分配给m_b
后,a.m_b
仍然有效存在。
这让我感到困惑,因为我认为将对象分配给boost::optional<>
只是分配指向该对象的地址。由于在我的示例中,该对象是b
,它是一个局部变量,因此在函数f()
完成后,它的地址应该是无效的。
那为什么a.m_b
还活着呢?它应该指向无效的地址。
boost::optional
的operator=
将调用B
的复制构造函数。如果将其插入到struct B
则可以在其上设置断点以查看发生了什么:
B(B const& other)
{
}
Boost 在其实现中使用了新的放置位置,也许这就是让您感到困惑的地方?
相关文章:
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 在通知提升间处理条件变量时未按住锁会导致问题
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 离开范围后如何保护局部变量的值?
- 局部变量名称冲突
- C++ lambda:如何'freeze'局部变量的值?
- 我应该使我的局部变量常量还是可移动的
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 返回对局部变量 - C++ 的引用
- 我如何改善IF/其他局部变量的处理
- boost::optional<>如何处理局部变量?