左值引用和右值引用作为参数表示方式分别为:
template <class T>
void f(T&);
template <class T>
void f(T&&);
在调用函数f的时候,我们可能传入一个左值,也可能传入一个右值。
由于存在T&&这种未定的引用类型,当它作为参数时,有可能被一个左值引用或者右值引用的参数初始化,这时候经过类型推导的T&&类型相比右值引用会发生变化。
具体规则是:
1.所有右值引用折叠到右值引用上仍然是一个右值引用。(A&& && 变成 A&&)
2.所有的其他引用类型之间的折叠都将变成左值引用。 (A& & 变成 A&; A& && 变成 A&; A&& & 变成 A&)