首页 > 编程语言 >effective modern c++ - 1 理解模板类别推导

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

时间:2023-01-15 19:00:10浏览次数:40  
标签:const effective 推导 modern c++ param template 实参 模板

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

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

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实现会自定义这个名字)

标签:const,effective,推导,modern,c++,param,template,实参,模板
From: https://www.cnblogs.com/ijpq/p/17053846.html

相关文章

  • C++追加单个字符
    在C++中如何在字符串的后面追加单个的字符呢?代码如下:stringstr;for(chari='A';i<='Z';i++){str+=i;}cout<<str<<endl<<endl;------------------------------......
  • C++获取输入的空格
    在控制台输入输出中,有时候我们想获取用户输入的空格,该如何做呢?在C++中通常的获取输入的方法如下:#include"stdafx.h"#include<iostream>#include<string>usingnamespaces......
  • c++求绝对值
    ---------------------------------------------------------------------------------------C语言中求绝对值的函数为abs(),在C++中对函数abs()进行了重载,这样方便了我们的......
  • c++设置控制台输出的行数和列数
    ----------------------------------------------------------------------------------有时候因为要输出的内容很多,控制台一页显示不完,这时我们可以通过设置控制台输出的行......
  • C++相关总结
    在学习C++的时候,最初是在VS上输出HELLOWORLD,然后开始了C++学习之路,然后开始在b站等一些地方看相关视频,在过了一遍基础之后开始学习C++Primer.C++Primer这本书很厚,在看的......
  • 【数据结构与算法】二分查找算法(C++实现)
    两种写法,取决于划分规则。这两种写法是学的yxc的,至此以后,写二分查找再也不含糊了!yxc的分享在此:二分查找算法模板第一种写法:boolbinarySearch(vector<int>&nums,int......
  • C++计算矩阵对角线和的程序
    二维数组或矩阵的使用对于几个应用。矩阵行和列用于保存数字。我们可以定义2DC++中的矩阵也使用多维数组。在本文中,我们将了解如何使用C++计算给定方阵的对角线和。矩......
  • 最新教程:ubuntu下学会搭载vscode C++编译环境
    首先最重要的还是要参考官网教程https://code.visualstudio.com/docs/cpp/introvideos-cpp在配置过程中要生成3个json文件①tasks.json:编译器编译任务配置文件;②......
  • C/C++显示类型转换的位拓展方式
    最近用verilator写模块的tb,在这里卡了好久(测半天都是C++写的问题)要点变量从小位宽到大位宽显示类型转换(explicitcast)时的位拓展方式,取决于转换前变量的符号性。倘若......
  • C++ 序列化和反序列化
    序列化1、背景1、在TCP的连接上,它传输数据的基本形式就是二进制流,也就是一段一段的1和0。2、在一般编程语言或者网络框架提供的API中,传输数据的基本形式是字节,也就是Byte......