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::optional
的 documentation 提到了这个:
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&>
.
,您的程序将是格式错误的
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.
假设我有:
#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::optional
的 documentation 提到了这个:
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&>
.
A program that necessitates the instantiation of template
optional
for a reference type, or for possibly cv-qualified typesin_place_t
ornullopt_t
is ill-formed.