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这个副本是否能被修改。
effective modern c++ - 1 理解模板类别推导

param仍然是实参的副本,因此将实参的const忽略掉,因此param的类型T推导为const char *
因为此时模板推导是按值传递的,所以把ptr这个指针的值,按bit复制给param,所以param仍然指向那个const char。
effective modern c++ - 1 理解模板类别推导

模板中行参类型是“万能引用”时

实参是rvalue时,可以按照一般的推导规则理解
实参是lvalue时,类型推导结果是左值。如x,cx,rx。
effective modern c++ - 1 理解模板类别推导


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

  1. IDE的悬停信息可以指示出类型信息,原理是让compiler执行一遍。
  2. 错误的执行一遍,可以根据compiler的报错看出来
  3. 使用运行时printf方法(不过这种方法打印出来的信息不容易看出来,不同compiler实现会自定义这个名字)

原文链接: https://www.cnblogs.com/ijpq/p/17053846.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

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

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/312161

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 下午12:17
下一篇 2023年2月16日 下午12:17

相关推荐