当前位置: 首页 > news >正文

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的意义是&#xff1a;在声明变量时&#xff0c;根据初始化表达式自动推断该变量的类型。声明函数时作为函数返回值的占位符&#xff08;用在函数返回类型后置的情况&#xff09;。 如 auto i 6; //auto推断为intauto func()->int //函数返…...

【随机种子初始化】一个神经网络模型初始化的大坑

1 问题起因和经过 半年前写了一个模型&#xff0c;取得了不错的效果&#xff08;简称项目文件1&#xff09;&#xff0c;于是整理了一番代码&#xff0c;保存为了一个新的项目&#xff08;简称项目文件2&#xff09;。半年后的今天&#xff0c;我重新训练这个整理过的模型&…...

翻过那座山——Gitlab流水线任务疑难之编译有子模块的项目指南

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;我们面对的不是…...

手机照片删除后如何恢复

在如今移动互联网和智能手机时代&#xff0c;拍摄照片已经成为了人们常见的一种生活方式&#xff0c;尤其是通过手机拍摄照片已经成为了许多人记录生活点滴、分享经验和表达情感等的必备工具。但是&#xff0c;随着手机照片量的激增&#xff0c;意外删除手机中珍贵照片的事件也…...

SpringBoot 线上服务假死,CPU 内存正常,什么情况?

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

kotlin从入门到精通之内置类型

基本类型 声明变量 val&#xff08;value的简写&#xff09;用来声明一个不可变的变量&#xff0c;这种变量在初始赋值之后就再也不能重新赋值&#xff0c;对应Java中的final变量。 var&#xff08;variable的简写&#xff09;用来声明一个可变的变量&#xff0c;这种变量在初始…...

实战指南:使用Spring Boot实现消息的发送和接收

当涉及到消息发送和接收的场景时&#xff0c;可以使用Spring Boot和消息中间件RabbitMQ来实现。下面是一个简单的示例代码&#xff0c;展示了如何在Spring Boot应用程序中创建消息发送者和接收者&#xff0c;并发送和接收一条消息。 首先&#xff0c;你需要进行以下准备工作 确…...

常用的数据结构——栈

目录 1、入栈 2、出栈 3、获取栈顶的元素 4、从栈中查找元素 栈是一种常见的数据结构&#xff0c;栈的特点是后进先出&#xff0c;就像我们叠盘子&#xff0c;拿走上面的盘子才能拿到下一个。java中的栈java.util.Stack是通过java.util.Vector实现的&#xff0c;所以底层都…...

C++完成淄博烧烤节管理系统

背景&#xff1a; 这次我们结合今年淄博烧烤做一个餐厅管理系统&#xff0c;具体需求如下&#xff0c;我们选择的是餐饮商家信息管理 问题描述&#xff1a; 淄博烧烤今年大火&#xff0c;“进淄赶烤”是大家最想干的事情&#xff0c;淄博烧烤大火特火的原因&#xff0c;火的…...

我心中的TOP1编程语言

目录 一、评选最佳编程语言时需要考虑哪些标准 &#xff08;一&#xff09;易用性 &#xff08;二&#xff09;执行效率 &#xff08;三&#xff09;语言功能特性 &#xff08;四&#xff09;工具生态环境 &#xff08;五&#xff09;开发者社区 二、不同编程语言的优点…...

Linux工具之gdb(含移植到arm-linux系统)

文章目录 文件目录结构移植ncurses库移植gdb移植到arm板调试测试 linux主机&#xff1a;ubuntu-18.04 交叉编译器&#xff1a;arm-buildroot-linux-gnueabihf 开发板kernel&#xff1a;Linux 5.4.0-150-generic x86_64 开发板&#xff1a;100ASK_STM32MP157_PRO开发板 arm-…...

DolphinScheduler

参考 Apache DolphinScheduler v1.3.9 使用手册 内置组件 masterserverworkserverzookeepertask queuealertapiui 设计 去中心化设计 通过zk选举 UI功能 队列管理 Yarn调度器的资源队列 用户管理 租户对应的是Linux系统用户&#xff0c;是Worker执行任务使用的用户 用户…...

10大白帽黑客专用的 Linux 操作系统

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

Golang每日一练(leetDay0099) 单词规律I\II Word Pattern

目录 290. 单词规律 Word Pattern &#x1f31f;  291. 单词规律 II Word Pattern ii &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 …...

linux_centos7.9/ubuntu20.04_下载镜像及百度网盘分享链接

1、镜像下载站点 网易开源镜像&#xff1a;http://mirrors.163.com/ 搜狐开源镜像&#xff1a;http://mirrors.sohu.com/ 阿里开源镜像&#xff1a;https://developer.aliyun.com/mirror/ 首都在线科技股份有限公司&#xff1a;http://mirrors.yun-idc.com/ 常州贝特康姆软件技…...

Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟完美替代品)

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟替代品) 环境 win10pixel4Android13概览 …...

Yacc 与 Lex 快速入门

Yacc 与 Lex 快速入门 简介&#xff1a; Lex 和 Yacc 是 UNIX 两个非常重要的、功能强大的工具。事实上&#xff0c; 如果你熟练掌握 Lex 和 Yacc 的话&#xff0c;它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏。本文详细的讨论了编写自己的语言和编译器所 用到的这两…...

【开源与项目实战:开源实战】80 | 开源实战二(下):从Unix开源开发学习应对大型复杂项目开发

上两节课&#xff0c;我们分别从代码编写、研发管理的角度&#xff0c;学习了如何应对大型复杂软件开发。在研发管理这一部分&#xff0c;我们又讲到比较重要的几点&#xff0c;它们分别是编码规范、单元测试、持续重构和 Code Review。其中&#xff0c;前三点在专栏的理论部分…...

【单周期CPU】LoongArch | 立即数扩展模块Ext | 32位算术逻辑运算单元(ALU)

前言&#xff1a;本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本组合逻辑部件的设计。 &#x1f4bb;环境&#xff1a;一台内存4GB以上&#xff0c;装有64位Windows操作系统和Vivado 201…...

Python实现数据结构的基础操作

目录 一、列表&#xff08;List&#xff09; 二、字典&#xff08;Dictionary&#xff09; 三、集合&#xff08;Set&#xff09; 四、链表的实现 五、队列和栈 数据结构是计算机科学中非常重要的概念&#xff0c;它用于存储和组织数据以便有效地进行操作。Python作为一种…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...