effective modern c++ - 1 理解模板类别推导

模板中的行参类型推断会省略引用

在这两种模板中,行参的引用都会在推断过程中被省略

template<typename T> //template A
void f(T &param);
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。


掌握查看类型推导结果的方法

  1. IDE的悬停信息可以指示出类型信息,原理是让compiler执行一遍。
  2. 错误的执行一遍,可以根据compiler的报错看出来
  3. 使用运行时printf方法(不过这种方法打印出来的信息不容易看出来,不同compiler实现会自定义这个名字)
posted @ 2023-01-15 18:54  ijpq  阅读(9)  评论(0编辑  收藏  举报