引用折叠:创建引用的引用时(如模板参数、类型别名)会造成引用折叠。
在所有情况下(除了一个例外),引用折叠成一个普通的左值引用类型。一种特殊情况下,引用会折叠成右值引用,即右值引用的右值引用, T&& &&。
折叠规则如下:
1.
&+& -> &
&&+&->&
&+&&->&
2.&&+&& -> &&
3.左值(非引用)+&&(模板形参的)-> &,
(原理上:编译器自己在模板形参类型前
加上&,这样就等同于:&+&&,所以会
折叠为&)
注意注意注意:
第三种情况只适用于&&形参的模板函数,不适合普通函数!!!!!!
举个例子:
template<typename T> T func1(T&& x){
return x;
}
int func2(int &&x){
return x;
}
int main()
{
int i=1;
cout<<fun1(i);//OK,通过引用折叠,实 际调用的函数是ff(int&);
cout<<fun2(i);//error,编译错误,无法将右值引用绑定到左值
}