auto

news/2025/11/3 20:46:27/文章来源:https://www.cnblogs.com/taojiuwang/p/19185123

auto关键字的使用

auto

auto关键字是在编译期推到出类型然后替换,auto关键字不允许定义数组,不允许作为普通函数的参数,C++14之前不允许作为函数的返回值但是支持返回值后置,auto修饰的变量必须直接初始化,类内非const static成员变量不能用auto来修饰。
C++11提供了auto来自动推导类型,很大程度上提高了代码的直观性:

std::unordered_map<std::string, std::vector<int>> data_map;
// 不用auto
std::unordered_map<std::string, std::vector<int>>::iterator iter = data_map.begin();
// 使用auto推导
auto iter = data_map.begin();

但是auto的推到仍然引入了一些奇怪的问题,在C++中,类型说明符(如int),不仅代表着「类型」的含义还有「定义变量」的含义,auto可以视为一种带有类型推导的类型说明符,其本质仍然是类型说明符,所以,它同样承担了定义动作的任务,例如:

auto a = 1; //OKauto arr = {1, 3, 4}; //ERR,auto不允许定义数组

在C++14之前,auto关键字不允许推导函数返回值,但是支持返回值后置语法,所以在这种场景下,auto仅仅作为占位符,既不表示类型,也不表示定义变量,仅仅只是为了保证结构完整:

auto fun(int a) -> int; // () -> int表示定义函数,int表示函数返回值类型// C++14之后
auto Func(int cmd) {if (cmd > 0) {return 5; // 用5推导返回值为int}return std::string("123"); // ERR,返回值已经推导为int了,不能多类型返回
}

auto推导原则

同样还是出自这句话“auto是用来代替类型说明符的”,因此auto在语义上也更加倾向于“用它代替类型说明符”这种行为,尤其是它和引用、指针类型结合时,这种特性更加明显:

int a = 5;
const int k = 9;
int &r = a;
auto b = a; // auto->int
auto c = 4; // auto->int
auto d = k; // auto->int
auto e = r; // auto->int

可以看到,不论是用普通变量、只读变量、引用、常量去初始化auto变量时,auto都只会推导其类型,而不会带走其只读性,左右性这些内容。所以,auto的类型推导,并不是推导某个表达式的类型,而是去推导当前位置最合适的类型,采用「最简推导原则」。
比如说上面auto c = 4这里,auto可以推导为int,int &&,const int,const int &,const int &&,而auto选择的是里面最简单的那一种。
auto还可以跟指针符、引用符结合,而这种时候它还是满足上面“最简单”的这种原则,并且此时指的是“auto本身最简单”,举例来说:

int a = 5;
auto p1 = &a; // auto->int *
auto *p2 = &a; // auto->int
auto &r1 = a; // auto->int
auto *p3 = &p2; // auto->int *
auto p4 = &p2; // auto-> int **

p1p2都是指针,但auto都是用最简原则来推导的,p2这里因为我们已经显式写了一个*了,所以auto只会推导出int,因此p2最终类型仍然是int *而不会变成int **。同样的道理在p3p4上也成立。

auto& auto&&

auto&

当你需要直接修改原对象,或者希望避免不必要的拷贝时,可以选择auto&auto&一般会推导为左值引用,当接受的类型为右值时会直接报错。同时,auto&不会忽略顶层const,因此如果初始值是一个常量,auto推导出的变量不是常量,你可以修改它。如果需要保留常量性,应使用 const auto

auto&&

万能引用,会发生引用折叠,auto &&并不是要“定义一个右值引用”,而是“定义一个保持左右性的引用”,也就是说,绑定一个左值时会推导出左值引用,绑定一个右值时会推导出右值引用。不会忽略 const,不会推导出非引用。

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

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

相关文章

一行“优雅”代码踩爆3x3矩阵:Python列表乘法的“共享引用”陷阱

一行“优雅”代码踩爆3x3矩阵:Python列表乘法的“共享引用”陷阱 很多Python新手初次创建多维列表时,都会被[[0] * 3] * 3这种写法吸引——一行代码搞定3x3矩阵,看起来简洁又聪明。可当你像这样修改一个元素时,却会…

写给创业者新手:什么是MAU指标,什么是ARR、PMF

写给创业者新手:什么是MAU指标,什么是ARR、PMF大家好,我是jobleap.cn的小九。今天谈谈创业者必知必会的基础概念。# MAU MAU(Monthly Active Users)的定义是:**在一个自然月内至少登录或使用过一次产品的独立用户数…

git不小心把本地从未提交过的贮藏的版本删掉了,如何恢复?

事故发生背景:晚上加班不小心把未提交过的本地贮藏删掉了!!! 我是刚删完里面就反应过来,卧槽!!!误删本地贮藏了(因为我本地同时在改好几个需求,可能A需求改一半,还不能提交,所以就暂时贮藏在本地,然后就去…

ffmpeg安装配置

一、下载ffmpeg安装包打开Download FFmpeg 官网,选择 Windows builds for gyan.dev2.下滑选择 release builds 部分,选择 ffmpeg-7.1.1-essentials_build.zip3.下载完后,解压到本地二、配置本地环境变量开始菜单输入…

【C】 static用法

static用法 1. 在 C语言 中,static 关键字用于控制变量或函数的作用域和生命周期。当它修饰函数时,含义如下: static int add(int a, int b) {return a + b; } 上面的函数前加了 static,表示这是一个 静态函数(st…

Python线程锁

多线程用于IO、网络请求等地方,只要不是CPU密集型,都可以直接使用多线程。 线程锁在代码中发挥着关键的保护作用,让我详细解释它的工作原理: 锁的作用机制 1. 基本工作原理 with lock:if ensp_id in ensp_to_seq:r…

若依前端验证码的实现

由于之前没时间,现在重新写一份 好吵啊,游戏人的吼叫声,嗓门太大了 有钱了买个好的耳机 详细视频讲解:https://www.bilibili.com/video/BV1HT4y1d7oA?spm_id_from=333.788.player.switch&vd_source=886219f6fb…

从O(n)到O(n):Python字符串拼接的效率陷阱与最佳实践

从O(n)到O(n):Python字符串拼接的效率陷阱与最佳实践 在Python开发中,字符串拼接是最常见的操作之一。但看似简单的+号拼接,在循环场景下可能埋下严重的性能隐患。本文通过两段代码的对比,拆解字符串拼接的效率差异…

实验4:MobileNet ShuffleNet - OUC

实验4:MobileNet & ShuffleNet 姓名: 学号:姓名和学号?本实验属于哪门课程? 中国海洋大学25秋《软件工程原理与实践》实验名称? 实验4:MobileNet & ShuffleNet博客链接:学习要求CNN的基本结构:卷积、…

模拟赛 31

T1简单题,排序后直接枚举两个有画面格子之间的间隔数,即为可能节省的行数或列数,移动次数也易求。点击查看代码 #include<bits/stdc++.h> #define MAXN 500005 #define int long long const int inf=1e18; us…

CSP-S 2025 T3 小结

这个主要是写给自己看的。 就是观察到 b 性质是个扫描线。 考虑加强,会发现把 trie 树套上去就没了。 前面的思路不难想,主要是最后一步。 代码: #include<bits/stdc++.h> #include<bits/extc++.h> usi…

第三十二篇

今天是11月3号,进行期中考试了,难

2025年苏州AIGEO 优化服务商深度测评:TOP5 企业核心优势与实战案例对比

这份 GEO 优化服务商榜单与实践指南,既提供了可直接对标选择的优质服务商,也拆解了不同行业的定制化策略与落地路径。对企业而言,GEO 优化不再是单一的技术操作,而是 AI 时代品牌抢占流量入口、传递核心价值的关键…

使用 Docker Compose 轻松实现 INFINI Console 离线部署与持久化管理

本文是 INFINI Console 环境搭建系列的第四篇,专为需要在离线或内网环境中容器化部署 INFINI Console 与 Easysearch 的用户设计。系列回顾与引言 在我们的 INFINI 本地环境搭建系列博客中:第一篇《搭建持久化的 INF…

第6章 语句

6.5 if语句悬垂else (dangling-else) 问题:当一个if子句多于else子句时,对于每一个else,究竟属于哪个if。 C++中会将else匹配给最后出现的尚未匹配的if子句。

十一月杂题

十一月杂题1. CF1067D Computer Game 考虑有了一次升级机会之后一定只会对着期望收益最高的做。于是只需要决策升级之前的决策。设 \(f_t\) 为还剩 \(t\) 秒的最大收益,\(x\) 为期望收益最大的任务的期望收益,则有 \…

Modbus RTU 通信格式详解学习笔记

看似与人为善、心肠柔软之人,必然有一块坚硬如铁的心境土壤,在苦难人生中,死死支撑着那份看似愚蠢的善意1️⃣ 核心思想:Modbus RTU 报文 = 一封结构化的“电报” 想象一下,你要给朋友发一封电报:你得先告诉邮局…

Selenium3+Python3 自动化项目项目实战day1

HTML CSS JavaScript HTMl总体脉络 CSS皮肤组织 JavaScript二者神经组织 HTML 超文本标记语言 HTMl元素 HTML表单 CSS JaveScript

P1.python环境的配置和安装

P1.python环境的配置和安装1.1CUDA安装: 1.查看CUDA Version 在终端输入nvidia-smi2.下载安装配置CUDA1.2python3.8安装 C:\Users\ASUS\AppData\Local\Programs\Python\Python381.3Anaconda安装 1.软件下载安装测试一…

Python 中可变对象的“引用赋值”特性——可变对象的“引用传递”

一、踩坑代码 某程序老鸟讲了一个故事: “2019年夏天,我在做一个推荐系统的用户画像模块。当时写了这样的代码: # 当时的蠢代码,现在想起来都脸红 default_preferences = [] # 想着所有用户共享一个默认偏好 user…