我正在阅读 新 C++ (C++11⁄14) 概述(仅限 PDF) ,在幻灯片 288 中,它提供了 std::forward
的实现:
template<typename T> // For lvalues (T is T&),
T&& std::forward(T&& param) // take/return lvalue refs.
{ // For rvalues (T is T),
return static_cast<T&&>(param); // take/return rvalue refs.
}
然后在文本中给出另一个实现:
通常的
std::forward
实现是:
template<typename T>
struct identity {
typedef T type;
};
template<typename T>
T&& forward(typename identity<T>::type&& param)
{
return static_cast<identity<T>::type&&>(param);
}
有什么区别?为什么后者是通常的实施方式?
原文由 songyuanyao 发布,翻译遵循 CC BY-SA 4.0 许可协议
第一个的问题是你可以写
std::forward(x)
,它不会做你想要的,因为它总是产生左值引用。第二种情况的参数是非推导上下文,防止模板参数的自动推导。这迫使您编写
std::forward<T>(x)
,这是正确的做法。此外,第二个重载的参数类型应该是
typename identity<T>::type&
因为惯用std::forward
的输入总是一个左值。编辑: 该标准实际上要求一个与此等效的签名(顺便说一句,这正是 libc++ 所拥有的):