std::optional::value()
有以下两个重载
constexpr T& value() &;
constexpr const T & value() const &;
constexpr T&& value() &&;
constexpr const T&& value() const &&;
返回const右值引用有什么意义?
我能想到的唯一原因是让编译器能够帮助捕获未完成的行为(非常奇怪),如下所示
auto r = std::cref(const_cast<const std::optional<int>&&>(
std::optional<int>{}).value());
如果std::optional::value()
返回了const T&
,那么以上代码将会编译,并且会在以后使用r
reference_wrapper
时导致未定义的行为。
在上面返回const T&&
?
答案 0 :(得分:7)
不确定。结构中有const optional<T>
。您返回一个rvalue实例并访问可选成员。
由于您构建它的方式,您可以保证在这种情况下可选。所以你打电话给value()
。类型T
包含mutable
状态,可以有效地重复使用/被盗。 T const&&
重载赋予使用功能窃取该状态的权限。
struct mutable_type {
mutable std::vector<char> cache;
};
struct test_type {
const std::optional<mutable_type> bob;
};
test_type factory( int x ) {
if (x==0) return {};
return {mutable_type({{1,2,x}})};
}
auto moved_into = factory(3).bob.value().cache;
我相信,这会在vector
内移动bob
,在此上下文中为const
rvalue。它依赖于value()
在const&&
上下文中返回const&&
。