3

可能重复:
为什么在 C++0x 右值引用的前向定义中使用标识?

我真的很好奇 - 为什么std::forward需要显式模板参数?难道不能简单

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

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

4

1 回答 1

6

您的实现使得将左值作为右值转发是不可能的。对于左值 A,T 推导出为 A&,因此 A& 是您的返回类型(左值)。

有关适用于的用例列表,请参阅N2951forward

在完美的转发用例中需要将左值作为右值转发:

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);

将左值转换tA&&(右值)。

于 2011-07-09T16:24:52.590 回答