forward

如果参数是右值或右值引用,则有条件地将其参数强制转换为右值引用。 这会将参数的右值状态还原到转发函数,以支持完美转发。

template<class Type>    // accepts lvalues
Type&& forward(typename remove_reference<Type>::type& Arg)

template<class Type>    // accepts everything else
Type&& forward(typename remove_reference<Type>::type&& Arg) noexcept

参数

参数

说明

Type

传入 Arg 的值的类型,可能不同于 Arg 的类型。 通常由转发函数的模板参数决定。

Arg

要强制转换的参数。

返回值

如果传入 Arg 的值最初为右值或右值引用,则返回对 Arg 的右值引用;否则,返回 Arg,而不修改其类型。

备注

你必须指定显式模板参数来调用 forward

forward 不转发其参数。 而是在其参数最初为右值或右值引用时,通过有条件地将参数强制转换为右值引用,forward 使得编译器能够在得知转发的参数的原始类型后执行重载决策。 转发函数的实际参数的表面类型可能不同于其原始类型,例如,当右值用作函数的实际参数并绑定到形式参数名称时;拥有名称可使其成为左值,而无论该值是否作为右值实际存在。forward 将还原实际参数的右值状态。

还原参数原始值的右值状态以执行重载决策被称为“完美转发”。 通过完美转发,模板函数可接受任一引用类型的参数,并在必要时还原其右值状态以执行正确的重载决策。 通过使用完美转发,你可以保留右值的移动语义,而且无需提供仅根据其参数的引用类型而变化的函数的重载。

要求

标头:<utility>

命名空间: std

请参见

参考

<utility>

Lvalues 和 Rvalues