[C++11] auto初始值类型推导

news/2024/3/29 12:38:18/文章来源:https://blog.csdn.net/summer_dew/article/details/129210745

背景:旧标准的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的类型,编译器报错
  1. 隐式的类型定义也是 强类型定义 (auto所在那行,已经准确推断出其类型了)
  2. auto只能用于 类型推导 ,不能用于存储类型指示符的推导,比如auto int r =5;
  3. auto并不能代表一个实际类型的声明(如s的编译器错误),它只是一个类型声明的“占位符”
  4. auto声明的变量必须马上初始化,以让编译器推断出它的实际类型,并在编译时将其替换为真正的类型

推导规则

auto可以通指针、引用结合起来使用,还可以带上cv限定符(cv-qualifier, const和volatile限定符的统称)

推导规则

  1. 不声明为指针或引用时,auto的推导结果和初始化表达式抛弃引用和cv限定符后类型一致
  2. 当声明为指针或引用时,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

  1. 迭代器类型等场景
  2. 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*>();

参考文章

  1. 参考书籍《深入应用C++11》

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

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

相关文章

Java-多线程-增强篇-锁强化第3篇

Java集合框架中的锁 今天我们继续来学习锁 字符串操作中的锁 String是线程安全的&#xff0c;因为使用final修饰Stringbuilder 是线程不安全的&#xff0c;其方法没有使用synchronized修饰StringBuffer 是线程安全的&#xff0c;其方法使用synchronized修饰 List集合中的锁 …

内核并发消杀器(KCSAN)技术分析

一、KCSAN介绍KCSAN(Kernel Concurrency Sanitizer)是一种动态竞态检测器&#xff0c;它依赖于编译时插装&#xff0c;并使用基于观察点的采样方法来检测竞态&#xff0c;其主要目的是检测数据竞争。KCSAN是一种检测LKMM(Linux内核内存一致性模型)定义的数据竞争(data race)的工…

【网络原理8】HTTP请求篇

在上一篇文章当中&#xff0c;我们也提到了什么是HTTP。 每一个HTTP请求&#xff0c;都会对应一个HTTP响应。 下面这一篇文章&#xff0c;将聊一下HTTP请求的一些内容 目录 一、URL 第一部分&#xff1a;协议名称 第二部分:认证信息(新的版本已经没有了) 第三部分&#xf…

【数通网络交换基础梳理1】二层交换机、以太网帧、MAC地址详解及数据帧转发原理(爆炸细)

一、网络模型 万年不变&#xff0c;先从模型结构分析&#xff0c;现在大家熟知的网络模型有两种。第一种是&#xff0c;OSI七层模型&#xff0c;第二种是TCP/IP模型。在实际运用中&#xff0c;参考更多的是TCP/IP模型。 OSI七层模型 TCP/IP模型 不需要全部理解&#xff0c;…

Spring MVC 源码- HandlerExceptionResolver 组件

HandlerExceptionResolver 组件HandlerExceptionResolver 组件&#xff0c;处理器异常解析器&#xff0c;将处理器&#xff08; handler &#xff09;执行时发生的异常&#xff08;也就是处理请求&#xff0c;执行方法的过程中&#xff09;解析&#xff08;转换&#xff09;成对…

Python变量的定义和使用

定义&#xff1a;变量就是计算机内存中存储某些数据的位置的名称 形象理解变量就是一个存放东西的容器&#xff0c;该容器的名字就叫做变量&#xff0c;容器存放的东西就是变量的值 变量的组成&#xff1a; 标识&#xff1a;标识对象所储存的内存地址&#xff0c;使用内置函数i…

六千字让你明白什么是数字孪生?

文章目录1. 背景2. 数字孪生基础2.1 概念2.2 价值3. 技术生态3.1 技术体系3.2 核心技术3.2.1 多领域、多尺度融合建模3.2.2 数据驱动与物理模型融合的状态评估3.2.3 数据采集和传输3.2.4 全生命周期数据管理3.2.5 虚拟现实呈现3.2.6 高性能计算3.3 建设3.3.1 重点3.3.1.1 数字孪…

SEATA是什么?它的四种分布式事务模式

一、SEATA是什么&#xff1f; Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 在继续学习使用SEATA之前&#xff0c;对s…

数据结构栈的经典OJ题【leetcode最小栈问题大剖析】【leetcode有效的括号问题大剖析】

目录 0.前言 1.最小栈 1.1 原题展示 1.2 思路分析 1.2.1 场景引入 1.2.2 思路 1.3 代码实现 1.3.1 最小栈的删除 1.3.2 最小栈的插入 1.3.3 获取栈顶元素 1.3.4 获取当前栈的最小值 2. 有效的括号 0.前言 本篇博客已经把两个关于栈的OJ题分块&#xff0c;可以根据目…

【华为OD机试模拟题】用 C++ 实现 - 分糖果(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

Jina 3.14 版本发布!支持独立部署Executor

Jina 是一个 MLOps 框架&#xff0c;赋能开发者在云上构建多模态、跨模态的应用程序。Jina 能够将 PoC 提升为生产就绪服务。基础设施的复杂性交给 Jina&#xff0c;开发者能够直接轻松使用高级解决方案和云原生技术。&#x1f31f; GitHubhttps://github.com/jina-ai/jina/rel…

基于博客系统的测试用例

登陆界面博客预览页博客详情页博客编辑页

【华为OD机试模拟题】用 C++ 实现 - 时间格式化(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

MATLAB绘制雷达图/蜘蛛图

雷达图/蜘蛛图 1 方法一 函数来源为MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图) 1.1 调用函数 1.2 案例 2 方法二 函数来源为MATLAB帮助-spider_plot 2.1 调用函数 语法&#xff08;Syntax&#xff09;&#xff1a; spider_plot(P)spider_plot(P, Name, Value, ...)h …

内网穿透常用方法系列总结

前言在内网渗透时&#xff0c;一个WebShell或CobaltStrike、Metasploit上线等&#xff0c;只是开端&#xff0c;更多是要内网横向移动&#xff0c;扩大战果&#xff0c;打到核心区域。但后渗透的前提是需要搭建一条通向内网的“专属通道”&#xff0c;才能进一步攻击。可实战中…

中国ETC行业市场规模及未来发展趋势

中国ETC行业市场规模及未来发展趋势编辑根据市场调研在线网发布的2023-2029年中国ETC行业发展策略分析及战略咨询研究报告分析&#xff1a;随着政府坚持实施绿色出行政策&#xff0c;ETC行业也受到了极大的支持。根据中国智能交通协会统计&#xff0c;2017年中国ETC行业市场规模…

高端装备的AC主轴头结构

加工机器人的AC主轴头和位置相关动力学特性1. 位置依赖动态特性及其复杂性2. AC主轴头2.1 常见主轴头摆角结构2.2 摆动机构3. 加装AC主轴头的作用和局限性4. 切削机器人的减速器类型5. 其他并联结构形式参考文献资料1. 位置依赖动态特性及其复杂性 However, FRF measurements …

【华为OD机试模拟题】用 C++ 实现 - 求解连续数列(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

【异常】导出Excel异常This archive contains unclosed entries.

一、异常说明 二、定位问题代码 一看问题&#xff0c; 上下文都是与订单相关的内容。 查询代码的使用地方&#xff0c;发现出现在这个Mybatis的select语句中 查看备注&#xff0c;发现是订单物流&#xff0c;那就没跑了&#xff0c; 肯定是商城的物流模块出了问题 那是什么地…