1

考虑这个片段:

#include <stdexcept>

template <typename T> class MyClass;

template <typename T> struct MyClass<T &> {

  constexpr T &foo() && {
    return value != nullptr ? std::move(*value)
                            : throw std::runtime_error("foo");
  }

  constexpr decltype(auto) bar() && {
    return value != nullptr ? std::move(*value)
                            : throw std::runtime_error("bar");
  }

  T *value;
};

int main() {
  const int &good = MyClass<int &>{}.bar();
  const int &bad = MyClass<int &>{}.foo();
}

演示

为什么decltype(auto)方法中的返回规范bar有效,而无效?T&foo

4

1 回答 1

4

为什么 decltype(auto) 将 T& 推断为返回类型

不,返回类型bar()T&&,即int&&在这种情况下。对于decltype

如果表达式的值类别是 xvalue,则 decltype 产生 T&&;

std::move(*value)是一个 xvalue 表达式,所以推导出的返回类型是T&&.

另一方面, 的返回类型foo被指定为T&,但std::move(*value)它是一个 xvalue(右值)并且不能绑定到T&,即对非 const 的左值引用。

于 2021-09-23T08:57:58.860 回答