模板中的行参类型推断会省略引用
在这两种模板中,行参的引用都会在推断过程中被省略
template<typename T> //template A
void f(T ¶m);
template<typename T> // template B
void f(T param);
而templateB中,无论传入的实参是什么,param都是它的副本,一个全新的对象。
所以即使rx是一个左值引用,但T是一个int类型,param也是。
此外,因为param是实参的副本,因此实参的const和volatile属性也会被忽略,因为cx不可修改这个属性无法控制param这个副本是否能被修改。
param仍然是实参的副本,因此将实参的const忽略掉,因此param的类型T推导为const char *
因为此时模板推导是按值传递的,所以把ptr这个指针的值,按bit复制给param,所以param仍然指向那个const char。
模板中行参类型是“万能引用”时
实参是rvalue时,可以按照一般的推导规则理解
实参是lvalue时,类型推导结果是左值。如x,cx,rx。
掌握查看类型推导结果的方法
- IDE的悬停信息可以指示出类型信息,原理是让compiler执行一遍。
- 错误的执行一遍,可以根据compiler的报错看出来
- 使用运行时printf方法(不过这种方法打印出来的信息不容易看出来,不同compiler实现会自定义这个名字)