std ::在非模板函数中向前

std::forward in non-template function

本文关键字:函数 std      更新时间:2023-10-16

有一些具有rvalue参数的函数。还有其他功能也具有rvalue参数。第一个功能调用第二个功能:

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

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

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

是真的吗?哪个变体更正确?

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

前进的用法略有不同。它是这样使用的:

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

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

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

在您的情况下,您将收到RVALUE参考。移动它是正确的事情。

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

相关文章: