forward完美转发,是指在函数模板中,完全依照模板的参数类型(即保持参数的左值,右值特征),将参数传递给函数模板中的另一个函数。
void PrintT(int &t)
{
cout << "lvalue" << endl;
}
template<typename T>
void PrintT(int &t)
{
cout << "rvalue" << endl;
}
template<typename T>
void TestForward(T&& v)
{
PrintT(v);
PrintT(std::forward<T>(v));
PrintT(std::move(v));
}
Test()
{
TestForward(1);
int x = 2;
TestForward(x);
}
测试结果:
lvalue
rvalue
rvalue
lvalue
lvalue
rvalue
TestForward(1):
1是右值,调用PrintT(v)时,v变为左值,---->lvalue。
1是右值,调用PrintT(std::forward(v))时,v保持原来类型,v为右值,---->rvalue。
1是右值,调用PrintT(std::move(v))时,v为右值,---->rvalue。
TestForward(x):
x是左值,调用PrintT(v)时,v为左值,---->lvalue。
x是左值,调用PrintT(std::forward(v))时,v保持原来类型,v为左值,---->lvalue。
x是左值,调用PrintT(std::move(v))时,v变为右值,---->rvalue。