先来看这样一个模板函数
template <typename T>
void f(T&& t) {}
对于这样的模板参数 ,推导规则如下
当传入的表达式为左值时 T 会被推导为 T&
例如int a = 0; f(a);
这里的 T 就会被推导为 int&
当传入的表达式为右值时 T 会被推导为 T
例如f(0);
这里的 T 就会被推导为 int
对于第一种情况, T&& t
会被推导为 T& && t, 这就成了左值引用的右值引用了, 在 C++ 中 其实是不可以出现引用的引用的, 这里就提出了一个引用的概念:
如果定义出一个引用的引用,则这些引用会形成 折叠, 也就是引用折叠
- X& &, X& &&, X&& & 会被折叠为 X&
- X&& && 会被折叠为 X&&
只有右值引用的右值引用才会折叠成右值引用,其他情况都是左值引用
对于 T&& 参数,如果传入左值就会折叠成 int&,传入右值就会折叠成 int&&
所以 对于 T&& 类型的模板参数类型,也叫做万能引用