有一些函数有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));
}
这是真的吗?哪种变体更正确?
答案 0 :(得分:2)
前进是有条件的举动。在这里使用它就像是说你应该在if (true)
中包装语句。
答案 1 :(得分:1)
前锋的使用略有不同。它的使用方式如下:
void outer(int&& a)
{
inner(std::forward<int>(a));
}
在非模板代码上,转发确实令人困惑,因为没有转发。
由于转发参考和参考折叠而存在转发。带走那些,不再转发魔法。
在您的情况下,您正在接收右值参考。移动它是正确的做法。
Forward是条件移动,取决于您可能想要移动的变量的声明类型。如果该变量是左值参考,则std::forward<T>(t)
不会移动它。