可能重复:
Why use identity in forward definition for C++0x rvalue reference?
我真的很好奇 - 为什么std::forward
需要一个明确的模板参数?不能简单地
template<typename T> T forward(T&& ref) {
return ref;
}
如果可能的话,我真的很喜欢所有相关的细节,而不是简化。
答案 0 :(得分:6)
您的实施使得无法将左值作为右值转发。对于左值A,T推导为A&amp;,因此A&amp;是你的回报类型(左值)。
请参阅N2951,了解适用于forward
的用例列表。
在完美转发用例中需要将左值作为右值转发:
template <class T>
void bar(T&& t);
template <class T>
void foo(T&& t)
{
bar(std::forward<T>(t));
}
内部foo
t
始终是左值。考虑案例foo(A())
。 T
推导为A
,并且您希望将t
转发为右值A
,,即使 t
是左值。
forward<A>(t);
将左值t
转换为A&&
(左值)。