c++11中Universal Reference类型的模板参数的推导规则?
简单来说就是type&& + syntax + type deduction,即可以引用左值,也可以引用右值。
template<typename T> void f(T&& param); // “&&” 可能 代表rvalue reference
如果一个变量或者参数被声明为T&&
,其中T是被推导的类型,
那这个变量或者参数就是一个universal reference。
“T需要是一个被推导类型”这个要求限制了universal references的出现范围。在实践当中,几乎所有的universal references都是函数模板的参数。因为auto
声明的变量的类型推导规则本质上和模板是一样的,所以使用auto的时候你也可能得到一个universal references。
一个universal reference必须具有形如T&&。
和所有的引用一样,你必须对universal references进行初始化,而且正是universal reference的initializer决定了它到底代表的是lvalue reference 还是 rvalue reference:
- 如果用来初始化universal reference的表达式是一个左值,那么universal reference就变成lvalue reference。
- 如果用来初始化universal reference的表达式是一个右值,那么universal reference就变成rvalue reference。