c ++中的可选引用是否可以保留对象生命?

时间:2017-12-26 19:46:34

标签: 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;
}

在上文中,没有理由期望打印出一致的结果,因为realCat已发布}?或者optional是否会保留realCat的生命?

1 个答案:

答案 0 :(得分:5)

不,它没有,当您尝试打印paw的值时,您的代码具有未定义的行为。

生命周期扩展的C ++规则仅在临时对象绑定到const的右值引用或左值引用时应用,但realCat不是临时和绑定它到optional引用不会延长它的生命周期。

在任何情况下,这些生命周期延长规则都不适用于boost::optional<T&>boost::optional的{​​{3}}提到了这一点:

  

对const的Rvalue引用和左值引用在C ++中具有延长它们绑定的临时生命周期的能力。 可选参考文献没有此功能 ...

对于std::optional,如果您尝试创建std::optional<T&>,您的程序将会格式不正确。

documentation

  

需要为参考类型或可能是cv限定类型optionalin_­place_­t实例化模板nullopt_­t的程序格式不正确。

相关问题