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

xml*_*lmx 8 c++ language-lawyer auto template-argument-deduction c++20

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);
}
Run Code Online (Sandbox Code Playgroud)

我只是好奇:

是不是和下面这个更简单的一样?

auto decay_copy(auto&& v)
{
    return v;
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 16

不是在 2011 年,因为:

  • 我们没有auto函数的返回类型推导(这是 C++14 的功能),并且
  • 我们没有auto&& 函数参数(这是 C++20 的特性),并且
  • 右值引用并未从 return 语句中隐式移动(这也是 C++20 的一项功能)

但在 C++20 中,是的,这是现在实现decay_copy. auto演绎确实衰减,return v;隐式向前,其他一切都一样。


我想从技术上讲存在一种边缘情况,例如:

struct X {
    X();
    X(X&);
};
Run Code Online (Sandbox Code Playgroud)

对于 的原始表述decay_copy(X{}),这是格式不正确的(没有可行的构造函数用于X从右值构造 an X)。使用现有 C++20 规则下的新公式,它变得格式良好并调用非常量复制构造函数(因为我们执行此两步重载解析)。

如果采用P2266,那么它们将完全相同,因为return v;总是其视为v右值,就像现有的公式一样。