c++ auto学习笔记
一、auto的意义
在C++11中赋予auto的意义是:在声明变量时,根据初始化表达式自动推断该变量的类型。声明函数时作为函数返回值的占位符(用在函数返回类型后置的情况)。
如
auto i = 6; //auto推断为intauto func()->int //函数返回类型后置,auto作为占位符
{return 666;
}
二、使用auto的一些注意事项
1、当使用一个auto声明多个变量时,遵循由左至右的推导规则,以最左边的表达式推导出auto的类型;
int a = 5;
auto *p = &a, b = 10; //由于&a为int*类型,则p为int*类型;auto推导为int, b为int型变量
2、可以使用条件表达式初始化auto声明的变量,且当条件的值类型不同时,编译器总是使用表达能力更强的类型作为auto的推导类型;
auto i = true ? 5 : 10.0; //由于5为int型,10.0为double型,编译器会将auto推导为double
3、auto无法声明非静态成员变量
三、推导规则
1、如果auto声明的变量按值初始化,则推导出的类型会忽略初始化表达式的cv限定符(const和volatile限定符)、引用属性。但是指针属性会保留;
const int a = 5; //a为const int类型变量
auto b = a; //auto推导为int, b为int型变量,const属性被忽略int c= 8;
int &e = c; //e为int&类型
int &&f = 8; //f为int&&类型
auto i = e; //auto推导为int,忽略了左值引用的属性
auto j = f; //auto推导为int,忽略了右值引用的属性int *p = &c; //p为int*类型
auto pp = p; //auto推导为int*
2、 对于auto&声明的变量,无论初始值是什么类型,该变量都会被推导为对应的左值引用类型,且会保留cv属性;
int a = 1; //a是int型,左值
int &b = a; //b是int&型,左值引用
int &&c = 3; //c是int&&型,右值引用
const int d = 7; //d是const int型auto &m = a; //m被推导为int&, auto->int
auto &m = b; //m被推导为int&, auto->int
auto &m = c; //m被推导为int&, auto->int
auto &m = d; //m被推导为const int&,auto->const int
auto &m = 888; //error,无法编译通过,左值引用不能引用右值
3、对于auto&&声明的变量,导为左值引用类型;如果初始值是右值,该变量将会被推导为右值引用类型。同样的,也会保留cv限定符;
这里2,3点使用了引用折叠规则,可以参考这篇文章。
C++万能引用和完美转发_星星典典的博客-CSDN博客
int a = 1; //a是int型,左值
int &&c = 3; //c是int&&型,右值引用
const int d = 7; //d是const int型auto &&m = a; //m被推导为int&
auto &&m = c; //m被推导为int&。注意:c虽然是右值引用类型,用于引用右值,但是c本身是具名对象,是左值
auto &&m = d; //m被推导为const int&,auto->const int
auto &&m = 888; //888是右值,所以m被推导为int&&
4、使用auto声明变量时,如果初始化对象是一个数组或者是函数,则auto会被推导为对应的指针类型。
int arr[5];
void func(int){}auto ap = arr; //ap被推导为int*类型
auto fp = func; //fp被推导为void(__cdecl *)(int)类型
三、auto的常见用处
1、当我们一眼就能看出变量的初始化类型,为了简化代码,常常使用auto声明变量;
例如在for循环中遍历std::map,见如下代码。
如果不使用auto,我们就要使用std::map<std::string, int>::const_iterator来声明it。但是这并不会有什么好处,反而让代码读起来有点困难。
void func(std::map<std::string, int> data_map)
{for(const auto& it : data_map){std::cout << it.first << "value: " << it.second << std::endl;}
}
2、对于比较复杂的返回类型,例如lambda表达式、band等可以使用auto;
例如
int main()
{auto func = [](int a, int b){ std::cout << a + b << std::endl; };func(1, 2);func(3, 4);
}
对于lambda表达式func的类型,我们无法准确写出。好在我们无需关注lambda表达式的类型,直接使用auto声明就好。
3、作为函数返回值,支持返回类型的推导
C++14支持对对函数返回类型声明为auto的推导,所以我们可以这样使用auto:
auto sum(int a, int b){return a+b;}
很明显,函数sum的返回值将被推导为int。
但是,如果返回值可能存在多种情况时,必须返回值类型要保持一致。
例如,将sum写成如下这样,会发生编译错误。
auto sum(int a, int b)
{if (a < 0 && b < 0)return std::string("error");return a + b;
}
4、将auto作为lambda表达式的形参
如下代码所示,2个形参都是auto。在使用时a被推导为int,b被推导为double。在没指定返回值类型的情况下,返回值类型将被推导为表达能力更强的double。
注意,具名函数不可以将形参声明为auto。如果也想声明一个泛式的具名函数,可以使用模板函数的方法实现。
int main()
{auto sum2 = [](auto a, auto b){ return a + b; };std::cout << sum2(1, 3.4);
}
5、将auto&作为lambda的返回类型,可以通过推导返回引用类型
正常情况下,在后置返回类型中不可以使用auto,例如上面第3点中的具名函数sum,可以将auto作为前置返回类型,但是不可以后置。
但是人们发现,这种方法是可以让lambda表达式通过推导返回引用类型的唯一方式。
int main()
{auto sum2 = [](auto &a, auto b) -> auto &{ a = a + b; return a; };int a = 1;std::cout << "&a= " << &a << " &sum2 =" << &sum2(a, 3.4);
}
相关文章:
c++ auto学习笔记
一、auto的意义 在C11中赋予auto的意义是:在声明变量时,根据初始化表达式自动推断该变量的类型。声明函数时作为函数返回值的占位符(用在函数返回类型后置的情况)。 如 auto i 6; //auto推断为intauto func()->int //函数返…...

【随机种子初始化】一个神经网络模型初始化的大坑
1 问题起因和经过 半年前写了一个模型,取得了不错的效果(简称项目文件1),于是整理了一番代码,保存为了一个新的项目(简称项目文件2)。半年后的今天,我重新训练这个整理过的模型&…...

翻过那座山——Gitlab流水线任务疑难之编译有子模块的项目指南
📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不是…...
手机照片删除后如何恢复
在如今移动互联网和智能手机时代,拍摄照片已经成为了人们常见的一种生活方式,尤其是通过手机拍摄照片已经成为了许多人记录生活点滴、分享经验和表达情感等的必备工具。但是,随着手机照片量的激增,意外删除手机中珍贵照片的事件也…...

SpringBoot 线上服务假死,CPU 内存正常,什么情况?
背景 开发小伙伴都知道线上服务挂掉,基本都是因为cpu或者内存不足,出现GC频繁OOM之类的情况。本篇文章区别以上的情况给小伙伴们带来不一样的服务挂掉。 还记得哔哩哔哩713事故中那场诡计多端的0吗? 图片 对就是这个0,和本次事…...

kotlin从入门到精通之内置类型
基本类型 声明变量 val(value的简写)用来声明一个不可变的变量,这种变量在初始赋值之后就再也不能重新赋值,对应Java中的final变量。 var(variable的简写)用来声明一个可变的变量,这种变量在初始…...
实战指南:使用Spring Boot实现消息的发送和接收
当涉及到消息发送和接收的场景时,可以使用Spring Boot和消息中间件RabbitMQ来实现。下面是一个简单的示例代码,展示了如何在Spring Boot应用程序中创建消息发送者和接收者,并发送和接收一条消息。 首先,你需要进行以下准备工作 确…...
常用的数据结构——栈
目录 1、入栈 2、出栈 3、获取栈顶的元素 4、从栈中查找元素 栈是一种常见的数据结构,栈的特点是后进先出,就像我们叠盘子,拿走上面的盘子才能拿到下一个。java中的栈java.util.Stack是通过java.util.Vector实现的,所以底层都…...

C++完成淄博烧烤节管理系统
背景: 这次我们结合今年淄博烧烤做一个餐厅管理系统,具体需求如下,我们选择的是餐饮商家信息管理 问题描述: 淄博烧烤今年大火,“进淄赶烤”是大家最想干的事情,淄博烧烤大火特火的原因,火的…...
我心中的TOP1编程语言
目录 一、评选最佳编程语言时需要考虑哪些标准 (一)易用性 (二)执行效率 (三)语言功能特性 (四)工具生态环境 (五)开发者社区 二、不同编程语言的优点…...
Linux工具之gdb(含移植到arm-linux系统)
文章目录 文件目录结构移植ncurses库移植gdb移植到arm板调试测试 linux主机:ubuntu-18.04 交叉编译器:arm-buildroot-linux-gnueabihf 开发板kernel:Linux 5.4.0-150-generic x86_64 开发板:100ASK_STM32MP157_PRO开发板 arm-…...
DolphinScheduler
参考 Apache DolphinScheduler v1.3.9 使用手册 内置组件 masterserverworkserverzookeepertask queuealertapiui 设计 去中心化设计 通过zk选举 UI功能 队列管理 Yarn调度器的资源队列 用户管理 租户对应的是Linux系统用户,是Worker执行任务使用的用户 用户…...

10大白帽黑客专用的 Linux 操作系统
平时在影视里见到的黑客都是一顿操作猛如虎,到底他们用的都是啥系统呢? 今天给大家分享十个白帽黑客专用的Linux操作系统。 ▍1. Kali Linux Kali Linux是最著名的Linux发行版,用于道德黑客和渗透测试。Kali Linux由Offensive Security开发&…...

Golang每日一练(leetDay0099) 单词规律I\II Word Pattern
目录 290. 单词规律 Word Pattern 🌟 291. 单词规律 II Word Pattern ii 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 …...

linux_centos7.9/ubuntu20.04_下载镜像及百度网盘分享链接
1、镜像下载站点 网易开源镜像:http://mirrors.163.com/ 搜狐开源镜像:http://mirrors.sohu.com/ 阿里开源镜像:https://developer.aliyun.com/mirror/ 首都在线科技股份有限公司:http://mirrors.yun-idc.com/ 常州贝特康姆软件技…...

Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟完美替代品)
本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟替代品) 环境 win10pixel4Android13概览 …...
Yacc 与 Lex 快速入门
Yacc 与 Lex 快速入门 简介: Lex 和 Yacc 是 UNIX 两个非常重要的、功能强大的工具。事实上, 如果你熟练掌握 Lex 和 Yacc 的话,它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏。本文详细的讨论了编写自己的语言和编译器所 用到的这两…...
【开源与项目实战:开源实战】80 | 开源实战二(下):从Unix开源开发学习应对大型复杂项目开发
上两节课,我们分别从代码编写、研发管理的角度,学习了如何应对大型复杂软件开发。在研发管理这一部分,我们又讲到比较重要的几点,它们分别是编码规范、单元测试、持续重构和 Code Review。其中,前三点在专栏的理论部分…...

【单周期CPU】LoongArch | 立即数扩展模块Ext | 32位算术逻辑运算单元(ALU)
前言:本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本组合逻辑部件的设计。 💻环境:一台内存4GB以上,装有64位Windows操作系统和Vivado 201…...
Python实现数据结构的基础操作
目录 一、列表(List) 二、字典(Dictionary) 三、集合(Set) 四、链表的实现 五、队列和栈 数据结构是计算机科学中非常重要的概念,它用于存储和组织数据以便有效地进行操作。Python作为一种…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...