std::decay_t<T> decay_copy(T&&) 等同于auto decay_copy(auto&&)吗?

Is std::decay_t<T> decay_copy(T&&) equivalent to auto decay_copy(auto&&)?

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3255.html定义decay_copy如下:

template<typename T>
std::decay_t<T> decay_copy(T&& v)
{ 
    return std::forward<T>(v);
}

我只是想知道:

是否等同于下面更简单的?

auto decay_copy(auto&& v)
{
    return v;
}

不是在 2011 年,因为:

  • 我们没有 auto return 函数的类型推导(这是 C++14 的特性),
  • 我们没有auto&& 函数参数(这是 C++20 的特性),并且
  • Rvalue 引用没有隐式地从 return 语句中移出(这也是 C++20 的特性)

但是在 C++20 中,是的,现在这是实现 decay_copy 的有效方法。 auto演绎确实衰减,return v;隐含转发,其他都一样。


我想从技术上讲有一个边缘情况,比如:

struct X {
    X();
    X(X&);
};

根据 decay_copy(X{}) 的原始公式,这是错误的(没有可行的构造函数可以从右值 X 构造 X)。使用现有 C++20 规则下的新公式,它变得结构良好并调用非常量复制构造函数(因为我们这样做 two-step overload resolution)。

如果采用 P2266,那么它们将完全等价,因为 return v;总是v 视为右值,恰好正如现有公式所做的那样。