函数模板
<utility>

std::forward

左值 (1)
template <class T> T&& forward (typename remove_reference<T>::type& arg) noexcept;
右值 (2)
template <class T> T&& forward (typename remove_reference<T>::type&& arg) noexcept;
转发参数
如果 arg 不是左值引用,则返回 arg 的右值引用。

如果 arg 是左值引用,则函数在不修改其类型的情况下返回 arg

这是一个辅助函数,用于将作为右值引用的参数完美转发给推导出的类型,保留其中可能存在的移动语义。

需要此函数是因为所有命名值(例如函数参数)都始终评估为左值(即使是声明为右值引用的),这在保留模板函数中对其他函数的参数的潜在移动语义方面存在困难。

两个签名都返回相同的
1
static_cast<decltype(arg)&&>(arg)

通过提供两个签名并对 T 使用 remove_reference,可以强制任何实例化显式指定 T 的类型(任何隐式推导的 T 都将不匹配)。

参数

arg
一个对象。

返回值

如果 arg 是左值引用,则函数返回的 arg 的类型保持不变。
否则,函数返回一个右值引用(T&&),该引用指向 arg,可用于传递右值。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// forward example
#include <utility>      // std::forward
#include <iostream>     // std::cout

// function with lvalue and rvalue reference overloads:
void overloaded (const int& x) {std::cout << "[lvalue]";}
void overloaded (int&& x) {std::cout << "[rvalue]";}

// function template taking rvalue reference to deduced type:
template <class T> void fn (T&& x) {
  overloaded (x);                   // always an lvalue
  overloaded (std::forward<T>(x));  // rvalue if argument is rvalue
}

int main () {
  int a;

  std::cout << "calling fn with lvalue: ";
  fn (a);
  std::cout << '\n';

  std::cout << "calling fn with rvalue: ";
  fn (0);
  std::cout << '\n';

  return 0;
}

输出
calling fn with lvalue: [lvalue][lvalue]
calling fn with rvalue: [lvalue][rvalue]


数据竞争



异常

无异常保证:此函数从不抛出异常。

另见