模板型别推导-程序员宅基地

技术标签: C++  c++  

模板型别推导

函数模板及函数代码:

template<typename T>
void f(ParamType param);
f(expr);

在这种情况下,T的型别不仅依赖于expr的型别,还依赖于ParamType的形式。具体情况分为三种:

  • ParamType具有指针或者引用型别,但不是万能引用
  • ParamType是万能引用
  • ParamType不是指针也不是引用

ParamType具有指针或者引用型别,但不是万能引用:

型别推导过程:

  • 若expr具有引用或者指针型别,先将引用或者指针部分忽略
  • 对expr的型别和ParamType的型别执行模式匹配,来决定T的型别

例:

template<typename T>
void f(T& param);

int x = 10; //x型别int
const int cx = x; //cx型const int
const int& rx = x; //rx型别const int&

f(x); //T的型别int,param型别int&
f(cx);//T的型别const int,param型别const int&
f(rx);//T的型别const int,param型别const int&
template<typename T>
void f(const T& param);

int x = 10; //x型别int
const int cx = x; //cx型const int
const int& rx = x; //rx型别const int&

f(x); //T的型别const int,param型别const int&
f(cx);//T的型别const int,param型别const int&
f(rx);//T的型别const int,param型别const int&

Param是个万能引用

型别推导规则:

  • expr如果是左值,T和ParamType都会推导为左值引用(在模板型别推导中,唯一一种T被推导为左值引用的情况)
  • expr如果是右值,引用情况1的规则

例:

template<typename T>
void f(T&& param);

int x = 10; //x型别int
const int cx = x; //cx型const int
const int& rx = x; //rx型别const int&

f(x); //x是左值,T的型别int&,param型别int&
f(cx);//cx是左值,T的型别const int&,param型别const int&
f(rx);//rx是左值,T的型别const int&,param型别const int&

f(10);//10是右值,T的型别int,param型别int&&

ParamType不是指针也不是引用

在这种情况下,执行的是值传递,param是传入对象的一个副本,推导规则为:

  • 如果expr具有引用型别,忽略引用部分
  • 如果expr是个const对象,也忽略const性质,如果是volatile对象,也同样忽略

例:

template<typename T>
void f(T& param);

int x = 10; //x型别int
const int cx = x; //cx型const int
const int& rx = x; //rx型别const int&

f(x); //T的型别int,param型别int
f(cx);//T的型别int,param型别int
f(rx);//T的型别int,param型别int
  • 特殊情况,expr是个const char* const ptr
    在这种情况下指针自身的const性质不会保留(因为是以复制的方式创建新指针的),而指向对象的const性质是会保留的(符合情况1)。

特殊情况:

  • 数组实参
  • 函数实参

在模板型别推导中,如果实参是数组或者函数,它们会退化成为指针,除非是用来初始化引用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wwangyansong/article/details/115873858

智能推荐

C语言中关于while语句的理解以及getchar和putchar_include<stdio.h>int main(){while(putchar(getchar()-程序员宅基地

文章浏览阅读888次,点赞32次,收藏9次。continue:跳过本次continue循环后面的代码,重新去判断部分(也就是重新进入while循环),看是否能够进行下一次循环。这串代码与上一次相比,我们把while中的条件改为了i_includeint main(){while(putchar(getchar())!='?'); return 0;}

74hc164驱动数码管c语言程序,74hc164应用电路图_74hc164驱动源程序-程序员宅基地

文章浏览阅读3.3k次。74hc164是高速硅门 CMOS 器件,与低功耗肖特基型 TTL (LSTTL) 器件的引脚兼容。74hc164是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。时钟 (CP) 每次由低变高时,数据右移一位,..._74hc164数码管

pyinstaller centos 打包记录_centos pyinstall-程序员宅基地

文章浏览阅读178次。报错2:error while loading shared libraries: libpython3.7m.so.1.0: cannot open shared object file: No such。报错1:OSError: Python library not found: libpython3.7mu.so.1.0, libpython3.7.so, l。添加库的配置信息,将python/lib的绝对路径(一般为:’/usr/python/lib’),添加至conf文件中。_centos pyinstall

linux下统计log中某个时间段的内出现某个关键字保存到文件_linux命令统计某个时间区间出现的关键字-程序员宅基地

文章浏览阅读674次。1、查看图中两个时间段内,且有“统计存储图片数据”的字段的日志 sed -n '/2021-06-03 11::25:34/,/2021-06-03 11:26:02/p' start.log |grep "统计存储图片数据" 注释: -n参数:只有经过sed特殊处理的那一行(或者动作)才会被显示 p参数:表示在终端打印出来 start.log:日志文件 grep: 对前面查询的结果进行过滤 "统计存储图片数据": 查询的关键字 时间段:格式和日志保持一致,且时间值是真实存在的2、将时._linux命令统计某个时间区间出现的关键字

手机翻译html工具,1分钟教你用手机实时翻译,自带翻译功能就是强大,各牌手机均可...-程序员宅基地

文章浏览阅读2.6k次。手机现在已经是我们的随身物品了,在很多事情上手机都可以帮助到我们,比如翻译,现在不仅是出国会用到翻译,就想平时的自我学习和工作上,都会遇到翻译的情况,今天就教大家一招用手机直接翻译的方法!今天主要就是给大家揭秘不同品牌手机里的翻译功能,一起来看看吧!1.小米手机小米手机在国产手机里的是非常受欢迎的,小米手机里的【扫一扫】不知道大家用过没有,我们打开扫一扫点击【翻译】然后选择翻译前后的语言,最后点击..._html格式的网页进行翻译

CSS背景background详解,background-position详解-程序员宅基地

文章浏览阅读3.3w次,点赞65次,收藏287次。背景(background)是css中一个重要的的部分,也是需要知道的css的基础知识之一。这篇文章将会涉及css背景(background)的基本用法,包括诸如 background-attachment 等的属性,也会介绍一些有关背景(background)的常用技巧,以及 css3 中的 背景(background)(包含4个新的背景(background)属性)。css2 中的背景(background)概述CSS2 中有5个主要的背景(background)属性,它们是:* ba_background-position

随便推点

使用Ajax实现简单的增删查改&&前端Ajax传的值,后端如何获取_ajax增删改查-程序员宅基地

文章浏览阅读4k次,点赞3次,收藏40次。实现查询和增删改一、Ajax最基本语法二、增删查改1.查询(Get请求)2.增删改(Post请求)三、后台(MVC/WebForm)1.MVC(Post请求)2.WebForm(Post请求)本人小白一个。其中所说可能有些不足,因为这些是我自己在写项目的过程中所使用的Ajax如有不对的地方,欢迎评论提出建议。一、Ajax最基本语法话不多说,直接上代码$.ajax({ url: "/User/GetUser",(这里写请求路径) type: "g_ajax增删改查

m4s格式转换mp4怎么转?只需3个步骤~-程序员宅基地

文章浏览阅读894次,点赞8次,收藏6次。无论您使用的是Windows、Mac还是Linux系统,主流播放器如VLC、Windows Media Player、QuickTime等都能轻松打开MP4文件,确保用户能够在各种平台上畅快观影。如果需要将M4S转换成MP4,野葱视频转换器为我们提供了便捷的解决方案,不仅具有稳定性,极少发生文件损坏,而且转换速度快,大大节约了时间。随着网络视频的普及,M4S通过分片存储音频和视频数据,提高了网络传输的效率,使得用户在观看视频时能够更加流畅地体验。处理完成后,你将在指定的输出路径中找到生成的MP4文件。_m4s格式转换mp4

CAN协议_为什么can诊断都是7开头-程序员宅基地

文章浏览阅读596次。网络管理报文(CAN 4开头,CAN FD 5开头),应用报文,诊断报文(7开头,物理寻址:一对一 比如对单体安全访问,在线编程,功能寻址:服务需要一对多,保证ECU的状态相同,比如多个 ECU需要知道车速的信息,温度的信息)CAN_H的电平为3.5V,CAN_L线的电平为1.5V,CAN_H和CAN_L的电压差为2V左右,CAN_H和CAN_L线上的电压均为2.5v, CAN_H和CAN_L之间的电压差为0V。1、位错误:当总线赢得发送权后,会对总线电平进行侦听,当发送的电平和侦听的电平不一致;_为什么can诊断都是7开头

基于OPC自定义接口的OPCClient功能改进_titaniumas.opc.client-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏9次。在本人之前的一篇博文中描写了如何使用OPC自定义接口开发OPCClient,并使用SignalR实现数据的远程实时传输。融合SignalR的OPCClient实现环境参数实时监测但是在使用过程中发现仍有不足之处,本文就是对之前OPCClient的功能改进进行说明。1.问题描述原有的OPCClient在测试环境下可以正常运行,但是在实际生产环境下长时间运行后问题就逐渐暴露出来。主要的问..._titaniumas.opc.client

宏工科技十五周年,“归零心态”竞逐全球-程序员宅基地

文章浏览阅读75次。宏工科技十五周年,“归零心态”竞逐全球

c++中的extern “C“_c++ extern c-程序员宅基地

文章浏览阅读1.6k次。c++中的extern "C"_c++ extern c

推荐文章

热门文章

相关标签