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作为一种…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...