[C++11] auto初始值类型推导
背景:旧标准的auto
在旧标准中,auto代表“具有自动存储期的 局部变量”
auto int i = 0; //具有自动存储期的局部变量
//C++98/03,可以默认写成int i=0;
static int j = 0; //静态类型的定义方法
- 实际上,我们很少使用
auto,因为非static即“具有自动存储期的”,所以不用人为去写auto
因此,在C++11中,auto关键字不再表示存储类型指示符(如static、register、mutable等都属于storage-class-specifiers),而是改成了一个类型指示符(type-specifier)。
auto初探
不同于Python等动态类型语言的运行时变量类型推导,隐式类型定义(如auto x = 5;)的类型推导 发生在编译期。它的作用是让编译器自动 推断出这个变量的类型,而不需要显式指定类型
auto x = 5; //OK: x是int类型
//字面量5是const int类型,变量x将被推导为int类型(const被丢弃)
auto pi = new auto(1); //OK: pi被推导为int*
const auto *v = &x, u=6; //OK: v是const int*类型,u是const int类型
//因为v,u已经被推导为const int类型
//1. u必须初始化,不然编译不予通过
//2. u的初始化不能使编译器产生二义性。如u=6.6,编译器会报错
static auto y - 0.0; //OK: y是double类型
auto int r; //error: auto不再表示存储类型指示符,编译器报错
auto s; //error: auto无法推导出s的类型,编译器报错
- 隐式的类型定义也是 强类型定义 (auto所在那行,已经准确推断出其类型了)
- auto只能用于 类型推导 ,不能用于存储类型指示符的推导,比如
auto int r =5; - auto并不能代表一个实际类型的声明(如s的编译器错误),它只是一个类型声明的“占位符”
- auto声明的变量必须马上初始化,以让编译器推断出它的实际类型,并在编译时将其替换为真正的类型
推导规则
auto可以通指针、引用结合起来使用,还可以带上cv限定符(cv-qualifier, const和volatile限定符的统称)
推导规则
- 当不声明为指针或引用时,auto的推导结果和初始化表达式抛弃引用和cv限定符后类型一致
- 当声明为指针或引用时,auto的推导结果将保持初始化表达式的cv属性
int x = 0;auto *a = &x; //a -> int* auto被推导为int
auto b = &x; //b -> int* auto被推导为int*
//auto不声明为指针,也可以推导出指针类型
auto &c = x; //c -> int& auto被推导为int
auto d = c; //d -> int auto被推导为int
//当表达式是一个引用类型时,auto会把引用类型抛弃const auto e = x; //e -> const int auto被推导为int
auto f = e; //f -> int auto被推导为int(non-const int)
//当表达式带有const(volatile也一样)属性时,auto会把const属性抛弃掉const auto& g = x; //e -> const int& auto被推导为int
auto& h = g; //f -> const int& auto被推导为const int//auto和引用(或指针)结合时,auto的推导将保留表达式的const属性
auto的推导和函数模板参数的自动推导
auto的推导和函数模板参数的自动推导有相似之处
上面的例子中的auto,和下面的模板参数自动推导出来的类型是一致的
template<typename T> void func(T x) {} //T -> auto
template<typename T> void func(T *x) {} //T* -> auto *
template<typename T> void func(T& x) {} //T& -> auto &template<typename T> void func(const T x) {} //const T -> const auto
template<typename T> void func(const T* x) {} //const T* -> const auto*
template<typename T> void func(const T& x) {} //const T& -> const auto&
因此,在熟悉auto推导规则时,可以借助函数模板的参数自动推导规则来帮助和加强理解。
auto的限制
void func(auto a = 1) {} //error: auto不能用于函数参数struct Foo{auto var1_ = 0; //error: auto不能用于非静态成员变量static const auto var2_ = 0; //OK: var2_ -> static const int//auto仅能用于推导static const的整形或枚举成员//1. 因为其他静态类型在C++标准中无法就地初始化//2. 虽然C++11可以接受非静态成员变量的就地初始化,但却不支持auto类型非静态成员的初始化
};template<typename T>
struct Bar{};void main() {int arr[10] = {0};auto aa = arr; //OK: aa -> int*//aa不会推导为int[10],而是int*auto rr[10] = arr; //error: auto无法定义数组Bar<int> bar;Bar<auto> bb = bar; //error: auto无法推导出模板参数
}
什么时候用auto
- 迭代器类型等场景
- auto简化函数定义
不加选择地随意使用auto,会带来代码可读性和维护性的严重下降。因此,在使用auto的时候,一定要权衡好。
auto简化函数定义
class Foo{
public:static int get(void) {return 0;}
};
class Bar{
public:static const char* get(void) {return "0";}
};template<class A>
void func(void){//对类型A都调用静态函数get来获取valauto val = A::get();//对val做统一处理//...
}func<Foo>();
func<Bar>();
如果不用auto,就不得不对func再添加一个模板参数,并在外部调用时手动指定get()的返回值类型
class Foo{
public:static int get(void) {return 0;}
};
class Bar{
public:static const char* get(void) {return "0";}
};template<class A, class B>
void func(void){B val = A::get();//...
}func<Foo, int>();
func<Bar, const char*>();
参考文章
- 参考书籍《深入应用C++11》
相关文章:
[C++11] auto初始值类型推导
背景:旧标准的auto 在旧标准中,auto代表“具有自动存储期的 局部变量” auto int i 0; //具有自动存储期的局部变量 //C98/03,可以默认写成int i0; static int j 0; //静态类型的定义方法实际上,我们很少使用auto,…...
【Java】List集合去重的方式
List集合去重的方式方式一:利用TreeSet集合特性排序去重(有序)方式二:利用HashSet的特性去重(无序)方式三:利用LinkedHashSet去重(有序)方式四:迭代器去重&am…...
每个人都应该知道的5个NLP代码库
在本文中,将详细介绍目前常用的Python NLP库。内容译自网络。这些软件包可处理多种NLP任务,例如词性(POS)标注,依存分析,文档分类,主题建模等等。NLP库的基本目标是简化文本预处理。目前有许多工…...
SPI协议介绍
SPI协议介绍 文章目录SPI协议介绍一、 SPI硬件知识1.1 硬件连线1.2 SPI控制器内部结构二、 SPI协议2.1 传输示例2.2 SPI模式致谢一、 SPI硬件知识 1.1 硬件连线 引脚含义如下: 引脚含义DO(MOSI)Master Output, Slave Input,SPI主控用来发出数据&#x…...
MySQL数据库中索引的优点及缺点
一、索引的优点 1)创建索引可以大幅提高系统性能,帮助用户提高查询的速度; 2)通过索引的唯一性,可以保证数据库表中的每一行数据的唯一性; 3)可以加速表与表之间的链接; 4&#…...
(q)sort函数总结(基础篇)
1.sort函数 介绍:这是一个C的函数,包含于algorithm头文件中。 基本格式: sort(起始地址(常为变量名),排序终止的地址(变量名加上排序长度),自定义的比较函数) 重点&a…...
【数据库】MongoDB数据库详解
目录 一,数据库管理系统 1, 什么是数据库 2,什么是数据库管理系统 二, NoSQL 是什么 1,NoSQL 简介 2,NoSQL数据库 3,NoSQL 与 RDBMS 对比 三,MongoDB简介 1, MongoDB 是什…...
【linux】进程间通信——system V
system V一、system V介绍二 、共享内存2.1 共享内存的原理2.2 共享内存接口2.2.1 创建共享内存shmget2.2.2 查看IPC资源2.2.3 共享内存的控制shmctl2.2.4 共享内存的关联shmat2.2.5 共享内存的去关联shmdt2.3 进程间通信2.4 共享内存的特性2.5 共享内存的大小三、消息队列3.1 …...
计算机网络的基本组成
计算机网络是由多个计算机、服务器、网络设备(如路由器、交换机、集线器等)通过各种通信线路(如有线、无线、光纤等)和协议(如TCP/IP、HTTP、FTP等)互相连接组成的复杂系统,它们能够在物理层、数…...
【数据结构趣味多】Map和Set
1.概念及场景 Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。 在此之前,我还接触过直接查询O(N)和二分查询O(logN),这两个查询有很多不足之出,直接查询的速率太低,而二分查…...
Redis 之企业级解决方案
文章目录一、缓存预热二、缓存雪崩三、缓存击穿四、缓存穿透五、性能指标监控5.1 监控指标5.2 监控方式🍌benchmark🍌monitor🍌slowlog提示:以下是本篇文章正文内容,Redis系列学习将会持续更新 一、缓存预热 1.1 现象…...
雷达实战之射频前端配置说明
在无线通信领域,射频系统主要分为射频前端,以及基带。从发射通路来看,基带完成语音等原始信息通过AD转化等手段转化成基带信号,然后经过调制生成包含跟多有效信息,且适合信道传输的信号,最后通过射频前端将信号发射出去…...
Android SDK删除内置的触宝输入法
问题 Android 8.1.0, 展锐平台。 过CTA认证,内置的触宝输入法会连接网络,且默认就获取到访问网络的权限,没有弹请求窗口访问用户,会导致过不了认证。 预置应用触宝输入法Go版连网未明示(开启后࿰…...
[202002][Spring 实战][第5版][张卫滨][译]
[202002][Spring 实战][第5版][张卫滨][译] habuma/spring-in-action-5-samples: Home for example code from Spring in Action 5. https://github.com/habuma/spring-in-action-5-samples 第 1 部分 Spring 基础 第 1 章 Spring 起步 1.1 什么是 Spring 1.2 初始化 Spr…...
H5视频上传与播放
背景 需求场景: 后台管理系统: (1)配置中支持上传视频、上传成功后封面缩略图展示,点击后自动播放视频; (2)配置中支持上传多个文件; 前台系统: &#…...
通过OpenAI来做机械智能故障诊断-测试(1)
通过OpenAI来做机械智能故障诊断 1. 注册使用2. 使用案例1-介绍故障诊断流程2.1 对话内容2.2 对话小结3. 使用案例2-写一段轴承故障诊断的代码3.1 对话内容3.2 对话小结4. 对话加载Paderborn轴承故障数据集并划分4.1 加载轴承故障数据集并划分第一次测试4.2 第二次加载数据集自…...
ASE40N50SH-ASEMI高压MOS管ASE40N50SH
编辑-Z ASE40N50SH在TO-247封装里的静态漏极源导通电阻(RDS(ON))为100mΩ,是一款N沟道高压MOS管。ASE40N50SH的最大脉冲正向电流ISM为160A,零栅极电压漏极电流(IDSS)为1uA,其工作时耐温度范围为-55~150摄氏度。ASE40N…...
MySQL基础命令大全——新手必看
Mysql 是一个流行的开源关系型数据库管理系统,广泛用于各种 Web 应用程序和服务器环境中。Mysql 有很多命令可以使用,以下是 Mysql 基础命令: 1、连接到Mysql服务器: mysql -h hostname -u username -p 其中,"ho…...
sklearn学习-朴素贝叶斯(二)
文章目录一、概率类模型的评估指标1、布里尔分数Brier Score对数似然函数Log Loss二、calibration_curve:校准可靠性曲线三、多项式朴素贝叶斯以及其变化四、伯努利朴素贝叶斯五、改进多项式朴素贝叶斯:补集朴素贝叶斯ComplementNB六、文本分类案例TF-ID…...
MySQL_主从复制读写分离
主从复制 概述 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行复制,从…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
