参考
https://www.cnblogs.com/zhangnianyong/p/11896309.html
如果一个地方即有左值引用,又有右值引用,而且功能函数内容相同,这样就要写两遍代码,问题变得更麻烦了,如:
#include <iostream>
void Func(const i &){
std::cout << i << std::endl;
}
void Func(int i&){
std::cout << i << std::endl;
}
void Func(int &&i){
std::cout << i << std::endl;
}
int main()
{
int a = 1;
const int b = a;
Func(b);//调用Func(const int &i);
Func(a);//调用Func(int &i);
Func(1);//调用Func(int && i);
}
为了解决这个问题,在模板函数上添加了一个完美转发语法,这样上面的几个函数可以合成一个函数, 如:
template <typename T>
void Func(T && t)
{
std::cout << t << std::endl;
}
注:这里的&&已经不是右值引用了,而是被称为万能引用(universal references),而这种用法称为完美转发