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

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

最佳答案

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

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

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

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.

关于c++ - c++ 中的可选引用是否保留对象生命?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47983078/

相关文章:

c++ - cin,输入所需详细信息后无输出

c++ - C++ 中的 Bittorrent 客户端,连接到非阻塞套接字上的对等点总是超时

c++ - 多进程c++的锁机制

c++ - 修改 Boost Python 包装类?

c++ - C++11 中 boost::shared_polymorphic_downcast 的 std 等价物在哪里?

c++ - 如何划分boost::optional<double>?

C++ 从 CreateProcess() 获取 UTF-8 输出

c++ - 使用 std::optional 参数调用函数

c++ - std::optional 和 boost::optional 是否遵守托管对象的对齐限制?

C++:如何将指针传递给另一个类的成员函数?