std::forward的作用是实现参数转发功能。我们知道参数可能是引用或右值引用,在函数内部再次传递该参数数时,我们希望参数还是保持原来的状态。那就需要用使用std::forward进行参数转发。下面看一个例子更加直观:
#include <iostream>
struct A {
A(int &&n) { std::cout << "rvalue = " << n << std::endl; }
A(int &n) { std::cout << "lvalue = " << n << std::endl; }
};
template <typename T, typename U> void forward(U &&u) {
T(std::forward<U>(u));
}
template <typename T, typename P, typename... U> void forward(P && p, U &&... u) {
T(std::forward<P>(p));
forward<T>(std::forward<U>(u)...);
}
int main() {
int i = 1;
forward<A>(i, 2, 3);
}
输出:
lvalue = 1
rvalue = 2
rvalue = 3
从上面的输出可以看出,变量i传入forward函数前是左值,再次传入A的构造函数时是左值引用。而右值2和3直到传入A的构造函数时都是右值引用。