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

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

Pra*_*ian 5

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

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

在任何情况下,这些终身延长规则都不适用boost::optional<T&>.该文档boost::optional提到了这一点:

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

至于std::optional,如果你试图创建,你的程序将是不正确的std::optional<T&>.

[optional.syn]/1

该必要的模板的实例化的程序optional用于引用类型,或用于可能CV-限定类型in_­place_­tnullopt_­t是形成不良的.