3

说我有:

#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

4

1 回答 1

5

不,它没有,当您尝试打印paw.

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

无论如何,这些生命周期延长规则不适用于boost::optional<T&>. 的文档boost::optional提到了这一点:

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

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

[可选.syn]/1

需要optional为引用类型或可能为 cv 限定类型in_­place_­t或格式错误的模板实例化的程序nullopt_­t

于 2017-12-26T19:52:42.187 回答