std :: forward的结构

时间:2011-07-09 15:23:32

标签: c++11 rvalue-reference

  

可能重复:
  Why use identity in forward definition for C++0x rvalue reference?

我真的很好奇 - 为什么std::forward需要一个明确的模板参数?不能简单地

template<typename T> T forward(T&& ref) {
    return ref;
}

如果可能的话,我真的很喜欢所有相关的细节,而不是简化。

1 个答案:

答案 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&&(左值)。