C++基础 auto 和 decltype的区别

auto关键字

auto 关键字允许编译器根据初始化表达式自动推导出变量的类型。这意味着你不需要显式写出变量的类型,编译器会根据你赋予的初始值来确定类型。这对于复杂类型、模板编程或是避免重复冗长的类型名称尤其有用,可以提高代码的可读性和编写效率。
简单的使用示例如下,可以简化迭代器的写法:

std::vector<int> p{ 1,2, 3, 4, 5 };
auto it = p.begin();	// auto 推导出 std::vector<int>::iterator
while (it != p.end()) {std::cout << *it << ' ';it++;
}

decltype关键字

decltype 则用于推断一个表达式的结果类型,而不是像 auto 那样推断一个初始化值的类型,同时与sizeof运算符类似,它不计算表达式的值,只分析表达式来确定其类型,下面是一个简单的使用示例,和上面的auto示例代码有着相同的效果:

std::vector<int> p{ 1,2, 3, 4, 5 };
decltype(p.begin()) it = p.begin();   
while (it != p.end()) {std::cout << *it << ' ';it++;
}

同时,decltype可以很方便的计算出某个表达式的返回类型,如下:

int f() {return 1;
}decltype(f() + 1 + 2.11) p;		// p的类型被推到为double

auto 和 decltype的区别

从上面的例子看来,auto和decltype貌似差不多。接下来我们着重于两者不同的地方,对于auto关键字来说,是没有办法保留变量的顶层const和引用属性的,如果想要推导出引用或者const,必须手动写出,如下例:

const int i = 1;
auto p = i;				// p 推导为int
const int& pi = i;
auto p2 = pi;			// p2 推导为intconst auto p3 = i;		// p3推导为 const int
const auto& p4 = pi;	// p4推导为 const int&

而对于decltype关键字而言,则可以推断出const和引用属性,见下例:

const int i = 0;
const int* const& p = &i;auto p1 = p;			// p1 推导为 const int* 类型,顶层const属性和引用丢失
decltype(p) p2 = p;		// p2 推导为 const int* const& 类型

除此之外,decltype还可以将表达式用()包裹,此时decltype的推导就不单单是表达式所属实体的类型,而是会继续通过表达式来推断出值类别来判断引用属性,

decltype((i)) p = i;				// 因为i为一个左值,故p推导为 int&
decltype((i + 1)) p2 = 1;			// 因为i+1表达式为一个右值,故p推导为int
decltype((std::move(i))) p3 = 1;	// std::move的结果为将亡值,故p推导为int&&

所以,decltype(x) 是变量名的规则,而 decltype((x)) 是表达式的规则,井水不犯河水,参数如果是变量名,就返回其声明的类型;而参数是表达式,再根据表达式的值类型来判断是否保留引用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sensor曝光时间

一、基本概念 1.曝光时间Te (Time exposure) 曝光时间指一个像素感光的时间&#xff0c;会影响势井中电子的数量&#xff0c;从而影响像素的亮度&#xff0c;通常的单位为ms。 2. 帧率 fps&#xff08;frame per second&#xff09; 帧率值单位时间完全读出图像的帧数&…

【编译原理】LL(1)分析法:C/C++实现

&#x1f516;墨香寄清辞&#xff1a;空谷幽篁风动&#xff0c;梦中仙鹤月明。 辗转千秋豪情在&#xff0c;乘风翱翔志不移。 目录 1. 编译原理之LL(1)分析法概念 1.1 编译原理 1.2 LL(1)分析法 2. LL(1)分析法 2.1 实验目的 2.2 实验要求 2.3 实验内容 2.3.1 实验解决…

Python筑基之旅-字符串(一)

目录 一、字符串 1、字符串的定义 1-1、使用单引号() 1-2、使用双引号(") 1-3、使用三引号(或""") 1-4、原始字符串(rstr或Rstr) 2、字符串的语法 3、获取字符串的属性和方法 4、获取字符串的帮助信息 5、字符串的用法 5-1、capitalize()方法…

通信技术信号源硬件实验

定义 1.RZ码&#xff08;归零码&#xff09; RZ编码也成为归零码&#xff0c;归零码的特性就是在一个周期内&#xff0c;用二进制传输数据位&#xff0c;在数据位脉冲结束后&#xff0c;需要维持一段时间的低电平。 2.NRZ码&#xff08;不归零编码&#xff09; NRZ编码也成为…

哈希表与离散化(题目)

A. 子串判重 题目描述&#xff1a; 给定一个含有 26 个小写英文字母的字符串。有 m 次询问&#xff0c;每次给出 2 个区间&#xff0c;请问这两个区间里的子字符串是否一样&#xff1f; 输入&#xff1a; 第一行输入一个字符串 S 。 第二行一个数字 m&#xff0c;表示 m 次…

000-基于Sklearn的机器学习入门:工作环境搭建与配置

本专栏将介绍基于Scikit-learn(简称Sklearn)的机器学习入门知识。包括但不一定限于&#xff0c;机器学习基本知识、Sklearn库简介&#xff0c;基于Sklearn库的机器学习实践。 这是本专栏的第000篇&#xff0c;将介绍如何安装和配置Sklearn环境&#xff0c;不仅包括Sklearn库的…

超级详细!如何正确使用JMeter性能测试?紧扣面试实际要求

前段时间专门挑了一段时间在准备面试。经过两次面试后&#xff0c;有一些比较深刻的认识。对于企业要求来说&#xff0c;除了对专业理论知识考究之外&#xff0c;对测试工具这块也是看重的。 一、使用JMeter测试快速入门 1、线程组是什么 进程&#xff1a; 一个正在执行的程序…

【springboot整合mybatis】xml文件映射不到

# spring框架中整合Mybatis时&#xff0c;指定该属性一边spring容器能够加载和解析mybatis的Mapper XML文件 mybatis.mapper-locationsclasspath:mapper/*.xml这条配置是MyBatis框架中用来指定Mapper XML文件位置的配置项。在Spring框架中整合MyBatis时&#xff0c;通常会在配置…

Arduino ESP8266模块TFT液晶屏

ESP8266模块 模块实物图&#xff1a; 模块引脚定义&#xff1a; 工作模式选择&#xff1a; FlashBoot启动模式&#xff1a; GPIO15接GND UART固件下载模式: GPIO15接GND&#xff0c; GPIO0接GND 调试串口&#xff1a; URXD/UTXD 可用来下载固件和调试信息输出 模块使能&…

WebService的配置

如果提示”对操作“XXX”的回复消息正文进行反序列化时出错 那么多半是因为字符长度不够 调整参数 maxStringContentLength"10485760" maxReceivedMessageSize"2147483647" maxBufferSize"2147483647" 示例&#xff1a; messageVersion&qu…

VMware虚拟机与MobaXterm建立远程连接失败

VMware虚拟机与MobaXterm建立远程连接失败 首先可以检查一下是不是虚拟机的ssh服务并不存在 解决方法&#xff1a; 1.更新镜像源 yum -y update 这个过程会有点久&#xff0c;请耐心等待 2.安装ssh yum install openssh-server 3.启动ssh systemctl restart sshd 4.查…

K8s存储对象的使用

背景和概念 容器中的文件在磁盘上是临时存放的&#xff0c;这给在容器中运行较重要的应用带来一些问题&#xff1a; 当容器崩溃或停止时&#xff0c;此时容器状态未保存&#xff0c; 因此在容器生命周期内创建或修改的所有文件都将丢失。另外 在崩溃期间&#xff0c;kubelet 会…

git命令行分支(增删改查)

文章目录 一、创建分支并推送到远程仓库二、拉取指定分支代码三、删除分支 一、创建分支并推送到远程仓库 初始化git git init如果有远程仓库就进行克隆远程仓库 origin 表示远程仓库地址 git clone origin# 如果没有远程仓库 就进行创建一个远程仓库 git remote add origin ht…

MySQL经典练习50题(下)(解析版)

所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#xff0c;请访问本篇笔记 书接上回&#xff08;1-25&#xff09; 经典50题&#xff08;26-50&#xff09; 查询每门课被选修的学生数 SELECT c.c_name,COUNT(DISTINCT sc.s_…

Flink的简单学习(kafka)三

一 Kafka的介绍 1.kafka是一个高吞吐的分布式消息系统&#xff0c;是一个消息队列。 2.生产者负责生产数据 &#xff0c;消费者负责消费数据 3.特点&#xff1a; 生存者消费者模型&#xff0c;FIFO 高性能&#xff1a;单节点支持上千个客户端&#xff0c;百MB/s吞吐 持久…

【Spring Cloud Alibaba】开源组件Sentinel

目录 什么是Sentinel发展历史与Hystrix的异同 Sentinel可以做什么&#xff1f;Sentinel的功能Sentinel的开源生态Sentinel的用户安装Sentinel控制台预备环境准备Sentinel 分为两个部分:下载地址 项目集成Sentinel创建项目修改依赖信息添加启动注解添加配置信息在控制器类中新增…

一条sql的执行流程

文章地址 https://blog.csdn.net/qq_43618881/article/details/118657040 连接器 请求先走到连接器&#xff0c;与客户端建立连接、获取权限、维持和管理连接 mysql缓存池 如果要查找的数据直接在mysql缓存池里面就直接返回数据 分析器 请求已经建立了连接&#xff0c;现在…

常见的XXE ---playload

XXE&#xff08;XML External Entity&#xff09;攻击是一种常见的Web安全漏洞&#xff0c;它允许攻击者干扰应用程序处理XML数据的方式。XXE攻击通常发生在应用程序解析XML输入时&#xff0c;没有正确地处理外部实体。 以下是一些常见的XXE攻击playload&#xff1a; 基本的XX…

基于Python的农业统计数据可视化系统设计与实现

基于Python的农业统计数据可视化系统设计与实现 Design and Implementation of Agricultural Statistical Data Visualization System Based on Python 完整下载链接:基于Python的农业统计数据可视化系统设计与实现 文章目录 基于Python的农业统计数据可视化系统设计与实现摘…

MySql索引的数据结构

mysql索引是什么&#xff1f; 想象一下&#xff0c;你手上有一本数学教材&#xff0c;但是目录被别人给撕掉了&#xff0c;现在要你翻到三三角函数的那一页&#xff0c;该怎么办&#xff1f; 没有了目录&#xff0c;就只有两种方法&#xff0c;要么一页一页翻&#xff0c;要么…