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
视为右值,恰好正如现有公式所做的那样。
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
视为右值,恰好正如现有公式所做的那样。