首先可以看完这篇文章
通过将函数模板的形参类型设置为 T&&(这个就是万能引用),我们可以很好地解决接收左、右值的问题。但除此之外,还需要解决一个问题,即无论传入的形参是左值还是右值,对于函数模板内部来说,形参既有名称又能寻址,因此它都是左值。那么他永远不会调用接下来函数的右值版本.
template <typename T> // 万能引用
void function(T&& t) {
otherdef(t);
}
引用折叠规则
//左值版本
void otherdef(int & t) {
cout << "lvalue\n";
}
//右值版本
void otherdef(const int & t) {
cout << "rvalue\n";
}
//实现完美转发的函数模板
template <typename T>
void function(T&& t) {
otherdef(forward<T>(t));
}
int main()
{
function(5);
int x = 1;
function(x);
return 0;
}
程序执行结果为:
rvalue
lvalue