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

Cur*_*ous 7 c++ rvalue-reference c++17 stdoptional

std::optional::value() 有两个以上的重载

constexpr T& value() &;
constexpr const T & value() const &; 
constexpr T&& value() &&;
constexpr const T&& value() const &&;
Run Code Online (Sandbox Code Playgroud)

返回const右值引用有什么意义?

我能想到的唯一原因是使编译器能够帮助捕获未完成的行为(真的很奇怪),如下所示

auto r = std::cref(const_cast<const std::optional<int>&&>(
    std::optional<int>{}).value());
Run Code Online (Sandbox Code Playgroud)

如果std::optional::value()已返回a,const T&则上述代码将编译,并在r reference_wrapper以后使用时导致未定义的行为.

以上返回的是否有任何其他角落案例const T&&

Yak*_*ont 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;
Run Code Online (Sandbox Code Playgroud)

我相信,这会移动vector内部bob,这const在这种情况下是一个左值.它依赖于在上下文中value()返回a .const&&const&&