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作为一种…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果