7

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()已经返回 aconst T&那么上面的代码将编译并在以后使用时会导致未定义的行为r reference_wrapper

上面返回 a 是否还有其他极端情况const T&&

4

1 回答 1

7

当然。你有一个const optional<T>结构。您返回一个右值实例并访问可选成员。

由于您构建它的方式,您可以保证在这种情况下使用可选。所以你打电话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;

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

于 2017-05-31T01:47:44.363 回答