Car*_*bon 3 c++ boost boost-optional
说我有:
#include <iostream>
#include "boost/optional.hpp"
struct cat
{
int paw = 4;
};
int main()
{
boost::optional<cat&> z;
{
cat realCat = cat();
z = realCat;
}
std::cout << z->paw << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面,没有理由期望打印出一致的结果,就像realCat发布的那样}?还是optional保留了生命realCat?
不,它没有,当您尝试打印值时,您的代码具有未定义的行为paw.
生命周期扩展的C++规则仅在临时对象绑定到右值引用或左值引用时应用const,但realCat不是临时对象,并且将其绑定到optional引用不会延长其生命周期.
在任何情况下,这些终身延长规则都不适用boost::optional<T&>.该文档的boost::optional提到了这一点:
Rvalue引用和对const的左值引用在C++中具有延长它们绑定的临时生命周期的能力.可选引用没有此功能 ......
至于std::optional,如果你试图创建,你的程序将是不正确的std::optional<T&>.
该必要的模板的实例化的程序
optional用于引用类型,或用于可能CV-限定类型in_place_t或nullopt_t是形成不良的.
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |