为什么const rvalue限定std :: optional :: value()返回一个const右值引用?

时间:2017-05-31 01:06:06

标签: c++ c++17 rvalue-reference stdoptional

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&&

时,是否还有其他一些案例需要考虑

1 个答案:

答案 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&&