模板的型别推到是C++最广泛的特性之一。现在让我们先简单看一个函数模板推导。
template<typename T>
void fun(PRAMTYPE pram);
fun(_parm);
这时我们会问T的类型是什么呢?PRAMTYPE的类型又是什么呢?_pram和T的类型,PRAMTYPE的类型存在什么关联呢?这时候就要分三种情况去讨论。
- PRAMTYPE具有指针或引用类型,但不是个万能引用。
当我们向引用后者指针型别传递常量对象时,说明我们要求该对象是具有只读属性,因此T的型别便具有const属性,pram的型别便是const的引用或者指针。因为对象的引用实质是另个对象的别名,所以对象的引用在推倒过程中会被忽略。当PRAMTYPE是引用型别时,数组或者函数不会向指针进行退化。
- RRAMTYPE是个万能引用(不是右值引用哦)
如果_pram是个左值,T和PRAMTYPE都会被推导成左值引用,如果为右值,T和PRAMTYPE按照第一种情况处理。
- PRAMTYP的类型是按值传递
按值传递的最大特性即是:传递的是对象的副本,而并非对象本身。因此,对象的常量性便会被忽略。当按值传递时,数组或者函数会退化成指针来使用。