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

Do optional references in c++ preserve object life?

假设我有:

#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 的生命?

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

仅当 临时 对象绑定到 const 的右值引用或左值引用时才适用生命周期延长的 C++ 规则,但 realCat 是不是临时的,将它绑定到 optional 引用不会延长它的生命周期。

无论如何,这些生命周期延长规则不适用于 boost::optional<T&>boost::optionaldocumentation 提到了这个:

Rvalue references and lvalue references to const have the ability in C++ to extend the life time of a temporary they bind to. Optional references do not have this capability ...

至于 std::optional,如果您尝试创建 std::optional<T&>.

,您的程序将是格式错误的

[optional.syn]/1

A program that necessitates the instantiation of template optional for a reference type, or for possibly cv-qualified types in_­place_­t or nullopt_­t is ill-formed.