非模板函数中的std :: forward

时间:2017-09-05 11:32:54

标签: c++ c++11

有一些函数有rvalue参数。还有另一个函数也有rvalue参数。第一个函数调用第二个函数:

void inner(int&& a)
{/* ... */}

void outer(int&& a)
{
    inner(std::move(a));
}

我使用了std::move,因为我们使用std::move将参数作为rvalue传递。但我的同事说std::forward更合适,因为我们在这里转发(不移动)右值参考:

void outer(int&& a)
{
    inner(std::forward(a));
}

这是真的吗?哪种变体更正确?

2 个答案:

答案 0 :(得分:2)

前进是有条件的举动。在这里使用它就像是说你应该在if (true)中包装语句。

答案 1 :(得分:1)

前锋的使用略有不同。它的使用方式如下:

void outer(int&& a)
{
    inner(std::forward<int>(a));
}

在非模板代码上,转发确实令人困惑,因为没有转发。

由于转发参考和参考折叠而存在转发。带走那些,不再转发魔法。

在您的情况下,您正在接收右值参考。移动它是正确的做法。

Forward是条件移动,取决于您可能想要移动的变量的声明类型。如果该变量是左值参考,则std::forward<T>(t)不会移动它。