我正在阅读 Overview of the New C++ (C++11/14) (PDF only) ,在幻灯片 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.
}
然后在文本中给出另一个实现:
The usual
std::forward
implementation is:
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);
}
有什么区别?为什么后者是通常的实现方式?
最佳答案
第一个问题是你可以写std::forward(x)
,它不会做你想要的,因为它总是产生左值引用。
第二种情况的参数是非推导上下文,防止模板参数的自动推导。这迫使你写 std::forward<T>(x)
,这是正确的做法。
另外,第二个重载的参数类型应该是 typename identity<T>::type&
因为 std::forward
的惯用输入始终是左值。
编辑:该标准实际上要求一个与此等效的签名(顺便说一句,这正是 libc++ 所拥有的):
template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept;
template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept;
关于c++ - std::forward 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27501400/