C++的auto关键字

news2024/12/25 18:05:15

 一、auto关键字介绍

因为C++是静态类型语言,即会在编译阶段进行类型检查。我们知道对象的类型决定一个对象所能参与的操作,因此如果类型检查过程中发现试图执行对象类型不支持的操作,编译器将会报错。

这要求我们在声明变量时必须指出变量的类型,而当用某个表达式初始化变量,有时我们根本不知道这个表达式的类型到底是什么,因此也就没办法给变量声明和定义。关于这一点,下面会给出例子。

1.同时定义一个变量

为了解决该问题,C++11引入了auto类型说明符,让编译器去分析表达式所属的类型。具体做法如下:

auto intVal=12;

12是一个int类型的字面值常量,因此auto推断intVal的类型为int。借助vscode查看变量类型可以证明这一点:

2.同时定义多个变量

另外要注意的一点是,如果在一个语句用auto声明了多个变量,则初始化这些变量的表达式都必须使对应声明的变量的类型一致,如:

auto intVal=12,doubleVal=0.12;

12是一个int类型的字面值常量,因此intVal判断出来的是int类型,而0.12是一个double类型的字面值常量,因此doubleVal推断出来的是double类型,两者推断的类型不一致,因此这条语句错误。证明如下:

3.抛出疑问

注意上面的红字,那为什么不说表达式类型相同,表达式类型相同不就使得推断的类型相同了吗?

是的,表达式类型相同,推断的类型是会相同。但表达式类型不同,有时也会使得推断的类型相同,继续看。

二、auto注意点

编译器推断出来的auto类型有时候和表达式初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。如:

1.auto忽略引用

当初始值是一个引用时,auto推断的类型并不是引用,而是引用绑定的对象的类型:

int intVal=1;
int &refVal=intVal;
auto val=refVal;

借助vscode看到val的类型为int,而不是int&。

2.auto忽略顶层const

 当初始值是一个顶层const时,auto推断的类型将不会是顶层const类型。

const int cIntVal=12;
auto val=cIntVal;

借助vscode看到val的类型为int,而不是const int。

如果希望val是一个顶层const,则必须自己手动添加const类型修饰符:

const int cIntVal=12;
auto const val=cIntVal;

 借助vscode看到val的类型为const int。

3.auto不会忽略底层const

这一点比较好理解,代码如下:

const int intVal=12;
const int* intP1=&intVal;
auto intP2=intP1;

 借助vscode看到val的类型为const int。

但需要注意的一点是,引用本身不是一个对象,因此常量引用其实是一个底层const,并不存在顶层const的说法,因此当auto去推断一个常量引用,同时声明的变量加了引用符(如果不加,推断的结果是引用绑定的对象去掉顶层const的类型),则推断的结果仍是常量引用,而不是普通引用,这符合C++不能使用非const引用绑定常量的语法规则。

const int intVal=12;
const int& ref1=intVal;
auto &ref2=ref1;
auto &ref3=12;

 借助vscode看到ref2的类型为const int&。

4.auto推断数组名 

数组名在C++很多场合下,都会转化为首元素地址,因此当auto推断的表达式是一个数组名的话,推断的结果是元素类型的指针。

int nums[3]={1,2,3};
auto p=nums;

  借助vscode看到p的类型为int*。

三、返回疑问

表达式类型不同,有时也会使得推断的类型相同:

const int cVal=1;
auto intVal1=2,intVal2=cVal;

代码在vscode上,并没有报错:

四、尾后置返回类型

 下面给出表达式类型未知的例子:

当我们使用C++模板写出下面的函数:

template<typename T, typename U>  
? add(T a, U b)
{  
    return a + b;  
}

请问a+b的类型是什么,我们根本没有办法确定a+b的类型。

因此为了应付这种情况,C++推出了尾后置返回类型,上面的函数正确的做法是:

template<typename T, typename U>  
auto add(T a, U b) -> decltype(a + b) 
{  
    return a + b;  
}

该做法意思是,当函数体执行完,再来判断函数的返回类型。

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

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

相关文章

php、mantis、showDoc部署

下载软件安装包:Mantis Bug Tracker 下载vs包&#xff1a;https://www.microsoft.com/en-us/download/details.aspx?id48145,解决“因为计算机中丢失msvcr110.dll”下载apache服务器:Apache VS17 binaries and modules download下载php:PHP For Windows: Binaries and source…

Kylin 入门教程

Apache Kylin 是一个开源的分布式数据仓库和 OLAP(在线分析处理)引擎,旨在提供亚秒级查询响应时间,即使在处理超大规模数据集时也是如此。Kylin 可以有效地将原始数据预计算为多维数据立方体(Cube),并利用这些预计算结果来提供快速查询。本文将带你从基础知识到操作实践…

【React】详解“最新”和“最热”切换与排序

文章目录 一、基本概念和初始化二、切换与排序功能的实现1. 函数定义和参数2. 设置活动 Tab3. 定义新列表变量4. 根据排序类型处理列表4.1 按时间降序排序4.2 按点赞数降序排序 5. 更新评论列表 三、渲染导航 Tab 和评论列表1. map 方法2. key 属性3. className 动态赋值4. onC…

五大设备制造商的 200 多种机型的安全启动功能完全失效

2012 年&#xff0c;一个由硬件和软件制造商组成的行业联盟采用了安全启动技术&#xff0c;以防范长期存在的安全威胁。这种威胁是恶意软件的幽灵&#xff0c;它可以感染 BIOS&#xff0c;即每次计算机启动时加载操作系统的固件。从那里&#xff0c;它可以保持不受检测和删除&a…

jenkins参数化构建在UI中定义脚本中使用

先看配置&#xff1a; 流水线脚本&#xff1a; pipeline {agent {//label "${server}"label "${28}"}stages {stage(Hello) {steps {echo "--------------------------"// 只有这个可以输出变量echo "${character_argument}"echo &q…

Pytorch使用教学5-视图view与reshape的区别

有同学后台留言问为什么view有时可对张量进行形变操作&#xff0c;有时就会报错&#xff1f;另外它和reshape功能好像一致&#xff0c;有什么区别呢&#xff1f;本文就带你了解PyTorch中视图的概念。 在PyTorch中对张量进行形变操作时&#xff0c;很多同学也会使用view方法&am…

kettle从入门到精通 第八十课 ETL之kettle kettle中的json对象字段写入postgresql中的json字段

场景&#xff1a;源数据库表为mysql的其中有json字段&#xff0c;通过kettle 查询出来 插入到目标数据库 postgresql中&#xff0c;对应的表中也有json字段。。但是报错&#xff0c;提示kettle查询出来是varchar的的字段&#xff0c;无法插入到目标数据库中。 1、创建测试表。 …

【VSCode实战】Golang无法跳转问题竟是如此简单

上一讲【VSCode实战】Go插件依赖无法安装 – 经云的清净小站 (skycreator.top)&#xff0c;开头说到了在VSCode中Golang无法跳转的问题&#xff0c;但文章的最后也没给出解决方案&#xff0c;只解决了安装Go插件的依赖问题。 解决了插件依赖问题&#xff0c;无法跳转的问题也离…

echo,tail ,飘号和重定向符

1. 输出指定内容 echo 语法; echo 输出的内容 较多内容使用 “ 双引号 ”&#xff0c; 相当于 printf &#xff1b; 2. 飘号 飘号&#xff0c;也就是我们通常所说的反引号&#xff0c;被飘号包括的内容会当作命令执行&#xff0c;常配合 echo 使用&#xff0c;输出结果为…

【python】python图书管理系统_普通用户+管理员菜单(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Docker安装 OpenResty详细教程

OpenResty 是一个基于 Nginx 的高性能 Web 平台&#xff0c;它集成了 Lua 脚本语言&#xff0c;使得开发者可以在 Nginx 服务器上轻松地进行动态 Web 应用开发。OpenResty 的核心目标是通过将 Nginx 的高性能与 Lua 的灵活性结合起来&#xff0c;提供一个强大且高效的 Web 开发…

IO多路复用——select

仅一个线程、进程处理并发 IO多路转接&#xff08;复用&#xff09;之select 跨平台适用linux&#xff0c;windows 底层&#xff1a;线性表 IO多路转接&#xff08;复用&#xff09;之poll 适用linux 底层&#xff1a;线性表 IO多路转接&#xff08;复用&#xff09;之epo…

微信小程序支付流程

前端需要做的事情&#xff1a; 生成平台订单&#xff1a;前端调用接口&#xff0c;向后端传递购买的商品信息、收货人信息&#xff0c;&#xff08;后端生成平台订单&#xff0c;返回订单编号&#xff09;获取预付单信息&#xff1a;将订单编号发送给后端后&#xff0c;&#x…

2024最新Selenium面试题(附带答案),建议收藏备用

一.你在TestNG中使用了哪些注解&#xff1f; TestBeforeSuiteAfterSuiteBeforeTestAfterTestBeforeClassAfterClassBeforeMethodAfterMethod 二.如何从Excel中读取数据&#xff1f; FileInputStream fs new FileInputStream(“excel文件路径”); Workbook wb WorkbookFact…

Web前端知识视频教程分享(五) Bootstrap

资料下载地址&#xff1a; https://545c.com/f/45573183-1336822373-45bb4f?p7526 (访问密码: 7526)

WordPress原创插件:自定义文章标题颜色

插件设置截图 文章编辑时&#xff0c;右边会出现一个标题颜色设置&#xff0c;可以设置为任何颜色 更新记录&#xff1a;从输入颜色css代码&#xff0c;改为颜色选择器&#xff0c;更方便&#xff01; 插件免费下载 https://download.csdn.net/download/huayula/89585192…

Xinstall揭秘:一键拉起服务如何助力App提升用户体验和下载转化率

在移动互联网时代&#xff0c;App的运营和推广显得尤为重要。而在这个过程中&#xff0c;如何提升用户体验和下载转化率成为了每个App运营者关注的焦点。今天&#xff0c;我们就来揭秘一下Xinstall的一键拉起服务&#xff0c;看看它是如何助力App提升用户体验和下载转化率的。 …

示例:WPF中如何处理TabControl页面绑定ItemsSource切换TabItem时UI数据没有持久保存的问题

一、目的&#xff1a;在WPF开发过程中&#xff0c;经常用到TabControl&#xff0c;也会遇到类似问题&#xff0c;用TabControl绑定数据源ItemsSource时&#xff0c;切换TabItem时&#xff0c;UI上的数据没有持久保存&#xff0c;本文介绍一种处理方式&#xff0c;可以做到缓存页…

解决学生技能短板:泰迪智能科技2024年中职大数据实验室,全面提升学生实践能力

一、中职院校现状及实验室建设背景 在当今信息化时代&#xff0c;大数据技术已成为国家战略发展的重要方向。中职院校作为我国职业教育体系的重要组成部分&#xff0c;肩负着培养高素质技术技能人才的重任。然而&#xff0c;目前我国中职院校在大数据教育方面存在以下问题&…