说我有:
#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;
}
在上文中,没有理由期望打印出一致的结果,因为realCat
已发布}
?或者optional
是否会保留realCat
的生命?
答案 0 :(得分:5)
不,它没有,当您尝试打印paw
的值时,您的代码具有未定义的行为。
生命周期扩展的C ++规则仅在临时对象绑定到const
的右值引用或左值引用时应用,但realCat
不是临时和绑定它到optional
引用不会延长它的生命周期。
在任何情况下,这些生命周期延长规则都不适用于boost::optional<T&>
。 boost::optional
的{{3}}提到了这一点:
对const的Rvalue引用和左值引用在C ++中具有延长它们绑定的临时生命周期的能力。 可选参考文献没有此功能 ...
对于std::optional
,如果您尝试创建std::optional<T&>
,您的程序将会格式不正确。
需要为参考类型或可能是cv限定类型
optional
或in_place_t
实例化模板nullopt_t
的程序格式不正确。