C++11新特性_自动类型推导_auto

       在 C++11 标准中,auto关键字被赋予了全新且强大的功能,它用于自动类型推导,即编译器能够根据变量的初始化表达式自动确定其类型

基本语法

使用auto声明变量时,只需给出auto关键字,后面紧跟变量名,并对其进行初始化,编译器会根据初始化表达式来推导变量的类型。基本形式如下:

auto variable = initializer;

应用场景和优点

       代码简洁:减少了手动指定类型的冗长代码,尤其是在处理复杂类型时,能让代码更加简洁易读。
      提高可维护性:当类型发生变化时,使用auto可以避免手动修改类型声明,减少出错的可能性。

1. 简单数据类型推导

#include <iostream>int main() {auto num = 10;  // 推导为 int 类型auto pi = 3.14; // 推导为 double 类型auto str = "hello"; // 推导为 const char* 类型std::cout << "num 的类型: " << typeid(num).name() << std::endl;std::cout << "pi 的类型: " << typeid(pi).name() << std::endl;std::cout << "str 的类型: " << typeid(str).name() << std::endl;return 0;
}

     在上述代码中,num根据初始化值10被推导为int类型,pi根据3.14被推导为double类型,str根据字符串字面量被推导为const char*类型。

2. 复杂类型推导

当处理复杂类型,如容器的迭代器时,auto的优势更加明显。

#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 传统方式声明迭代器std::vector<int>::iterator it1 = vec.begin();// 使用 auto 声明迭代器auto it2 = vec.begin();std::cout << "传统方式迭代器访问元素: " << *it1 << std::endl;std::cout << "使用 auto 迭代器访问元素: " << *it2 << std::endl;return 0;
}

      这里,使用auto声明迭代器it2时,无需写出冗长的std::vector<int>::iterator类型,编译器会自动推导其类型,使代码更加简洁。

3. Lambda 表达式类型推导

   Lambda 表达式的类型是编译器自动生成的,没有明确的类型名,使用auto可以方便地存储 Lambda 表达式。

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用 auto 存储 Lambda 表达式auto printNumber = [](int num) {std::cout << num << " ";};std::for_each(numbers.begin(), numbers.end(), printNumber);std::cout << std::endl;return 0;
}

  printNumber是一个 Lambda 表达式,使用auto来存储它,避免了处理复杂且无明确名称的 Lambda 表达式类型。

注意事项和不足

       必须初始化:使用auto声明变量时必须进行初始化,因为编译器需要根据初始化表达式来推导类型。
       类型推导的局限性auto在推导类型时可能会忽略顶层const、引用,数组等属性,需要根据具体情况显式指定。

       必须初始化比较好理解,以下详细介绍类型推导的局限性相关情况及解决办法。

1. 顶层 const 被忽略

       在 C++ 里,const 有顶层 const 和底层 const 之分。顶层 const 表示对象本身是常量,而底层 const 表示指针或引用所指向的对象是常量。当使用 auto 推导类型时,顶层 const 会被忽略,但底层 const 会被保留。

#include <iostream>int main() {const int a = 10; // 顶层 constauto b = a; // b 的类型是 int,顶层 const 被忽略// b = 20; // 可以修改 b,因为 b 不是 conststd::cout << "b 的类型: " << typeid(b).name() << std::endl; // b 的类型: iconst int* c = &a; // 底层 constauto d = c; // d 的类型是 const int*,底层 const 被保留// *d = 30; // 错误,不能通过 d 修改其所指向的值std::cout << "d 的类型: " << typeid(d).name() << std::endl;  //d 的类型: PKireturn 0;
}

    在上述代码中,变量 a 是顶层 const,使用 auto 推导 b 的类型时,顶层 const 被忽略,所以 b 是普通的 int 类型,可以对其进行修改。而指针 c 包含底层 const,使用 auto 推导 d 的类型时,底层 const 被保留,因此不能通过 d 修改其所指向的值。
   如果希望保留顶层 const,可以显式指定 const auto

const int a = 10;
const auto b = a; // b 的类型是 const int,保留了顶层 const
// b = 20; // 错误,不能修改 b

2. 引用属性被忽略

      当初始化表达式是引用类型时,auto 会忽略引用属性,推导出的是被引用对象的类型。若要保留引用类型,需要显式指定。

#include <iostream>int main() {int num = 10;int& ref = num;auto e = ref; // e 的类型是 int,而不是 int&e = 20; // 修改 e 不会影响 numauto& f = ref; // f 的类型是 int&,保留了引用属性f = 30; // 修改 f 会影响 numstd::cout << "num: " << num << std::endl; // 输出 30return 0;
}

        在这个例子中,ref 是 num 的引用,使用 auto 推导 e 的类型时,引用属性被忽略,e 是普通的 int 类型,修改 e 不会影响 num。而使用 auto& 推导 f 的类型时,保留了引用属性,f 是 int& 类型,修改 f 会影响 num

3. 数组退化为指针

          当使用 auto 推导数组类型时,数组会退化为指针。

#include <iostream>int main() {int arr[5] = {1, 2, 3, 4, 5};auto g = arr; // g 的类型是 int*,数组退化为指针return 0;
}

      在上述代码中,arr 是一个包含 5 个 int 元素的数组,使用 auto 推导 g 的类型时,数组退化为指针,g 的类型是 int*

      综上所述,在使用 auto 进行类型推导时,需要注意这些局限性,根据具体情况显式指定类型,以确保得到预期的结果。

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

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

相关文章

[预备知识]6. 优化理论(二)

优化理论 本章节介绍深度学习中的高级优化技术&#xff0c;包括学习率衰减、梯度裁剪和批量归一化。这些技术能够显著提升模型的训练效果和稳定性。 学习率衰减&#xff08;Learning Rate Decay&#xff09; 数学原理与可视化 学习率衰减策略的数学表达&#xff1a; 步进式…

【计算机视觉】语义分割:Mask2Former:统一分割框架的技术突破与实战指南

深度解析Mask2Former&#xff1a;统一分割框架的技术突破与实战指南 技术架构与创新设计核心设计理念关键技术组件 环境配置与安装指南硬件要求安装步骤预训练模型下载 实战全流程解析1. 数据准备2. 配置文件定制3. 训练流程4. 推理与可视化 核心技术深度解析1. 掩膜注意力机制…

数字智慧方案5857丨智慧机场解决方案与应用(53页PPT)(文末有下载方式)

资料解读&#xff1a;智慧机场解决方案与应用 详细资料请看本解读文章的最后内容。 随着科技的飞速发展&#xff0c;智慧机场的建设已成为现代机场发展的重要方向。智慧机场不仅提升了旅客的出行体验&#xff0c;还极大地提高了机场的运营效率。本文将详细解读沃土数字平台在…

【C到Java的深度跃迁:从指针到对象,从过程到生态】第五模块·生态征服篇 —— 第二十章 项目实战:从C系统到Java架构的蜕变

一、跨语言重构&#xff1a;用Java重写Redis核心模块 1.1 Redis的C语言基因解析 Redis 6.0源码核心结构&#xff1a; // redis.h typedef struct redisObject { unsigned type:4; // 数据类型&#xff08;String/List等&#xff09; unsigned encoding:4; // …

ES6异步编程中Promise与Proxy对象

Promise 对象 Promise对象用于解决Javascript中的地狱回调问题&#xff0c;有效的减少了程序回调的嵌套调用。 创建 如果要创建一个Promise对象&#xff0c;最简单的方法就是直接new一个。但是&#xff0c;如果深入学习&#xff0c;会发现使用Promise下的静态方法Promise.re…

UE自动索敌插件Target System Component

https://www.fab.com/zh-cn/listings/9088334d-3bde-4e10-a937-baeb780f880f ​ 一个完全用 C 编写的 UE插件&#xff0c;添加了对简单相机锁定/瞄准系统的支持。它最初​​在蓝图中开发和测试&#xff0c;然后转换并重写为 C 模块和插件。 特征&#xff1a; 可通过一组可在…

中小企业MES系统概要设计

版本&#xff1a;V1.0 日期&#xff1a;2025年5月2日 一、系统架构设计 1.1 整体架构模式 采用分层微服务架构&#xff0c;实现模块解耦与灵活扩展&#xff0c;支持混合云部署&#xff1a; #mermaid-svg-drxS3XaKEg8H8rAJ {font-family:"trebuchet ms",verdana,ari…

STM32移植U8G2

STM32 移植 U8G2 u8g2 &#xff08;Universal 8bit Graphics Library version2 的缩写&#xff09;是用于嵌入式设备的单色图形库&#xff0c;可以在单色屏幕中绘制 GUI。u8g2 内部附带了例如 SSD13xx&#xff0c;ST7xx 等很多 OLED&#xff0c;LCD 驱动。内置多种不同大小和风…

Langchain,为何要名为langchian?

来听听 DeepSeek 怎么说 Human 2025-05-02T01:13:43.627Z langchain 是一个大语言模型开发框架。我的理解中&#xff0c;lang 是词根"语言"&#xff0c;chain是单词"链"&#xff0c;langchain 便是将语言模型和组件串联成链的框架。而 langchain 的图标是…

Windows下Python3脚本传到Linux下./example.py执行失败

1. 背景 大多数情况下通过pycharm编写Python代码&#xff0c;编写调试完&#xff0c;到Linux下发布执行。 以example.py脚本为例 #! /usr/bin/env python3 #! -*- encoding: utf-8 -*- def test(x,y): xint x yint y cxy return c if _name_"__main__": print(test(2…

当MCP撞进云宇宙:多芯片封装如何重构云计算的“芯“未来?

当MCP撞进云宇宙:多芯片封装如何重构云计算的"芯"未来? 2024年3月,AMD发布了震撼业界的MI300A/B芯片——这颗为AI计算而生的"超级芯片",首次在单封装内集成了13个计算芯片(包括3D V-Cache缓存、CDNA3 GPU和Zen4 CPU),用多芯片封装(Multi-Chip Pac…

用定时器做微妙延时注意事项

注意定时器来着APB1还是APB2&#xff0c;二者频率不一样&#xff0c;配置PSC要注意 &#xff08;1&#xff09;高级定时器timer1&#xff0c; timer8以及通用定时器timer9&#xff0c; timer10&#xff0c; timer11的时钟来源是APB2总线 &#xff08;2&#xff09;通用定时器ti…

三类思维坐标空间与时空序位信息处理架构

三类思维坐标空间与时空序位信息处理架构 一、静态信息元子与元组的数据结构设计 三维思维坐标空间定义 形象思维轴&#xff08;x&#xff09;&#xff1a;存储多媒体数据元子&#xff08;图像/音频/视频片段&#xff09; 元子结构&#xff1a;{ID, 数据块, 特征向量, 语义…

spring boot中@Validated

在 Spring Boot 中&#xff0c;Validated 是用于触发参数校验的注解&#xff0c;通常与 ​​JSR-303/JSR-380​​&#xff08;Bean Validation&#xff09;提供的校验注解一起使用。以下是常见的校验注解及其用法&#xff1a; ​1. 基本校验注解​​ 这些注解可以直接用于字段…

Hadoop 单机模式(Standalone Mode)部署与 WordCount 测试

通过本次实验&#xff0c;成功搭建了 Hadoop 单机环境并运行了基础 MapReduce 程序&#xff0c;为后续分布式计算学习奠定了基础。 掌握 Hadoop 单机模式的安装与配置方法。 熟悉 Hadoop 环境变量的配置及 Java 依赖管理。 使用 Hadoop 自带的 WordCount 示例程序进行简单的 …

历史数据分析——运输服务

运输服务板块简介: 运输服务板块主要是为货物与人员流动提供核心服务的企业的集合,涵盖铁路、公路、航空、海运、物流等细分领域。该板块具有强周期属性,与经济复苏、政策调控、供需关系密切关联,尤其是海运领域。有不少国内股市的铁路、公路等相关的上市公司同时属于红利…

openEuler 22.03 安装 Mysql 5.7,TAR离线安装

目录 一、检查系统是否安装其他版本Mariadb数据库二、环境检查2.1 必要环境检查2.2 在线安装&#xff08;有网络&#xff09;2.3 离线安装&#xff08;无网络&#xff09; 三、下载Mysql2.1 在线下载2.2 离线下载 四、安装Mysql五、配置Mysql六、开放防火墙端口七、数据备份八、…

喷泉码技术在现代物联网中的应用 设计

喷泉码技术在现代物联网中的应用 摘 要 喷泉码作为一种无速率编码技术,凭借其动态生成编码包的特性,在物联网通信中展现出独特的优势。其核心思想在于接收端只需接收到足够数量的任意编码包即可恢复原始数据,这种特性使其特别适用于动态信道和多用户场景。喷泉码的实现主要…

GZIPInputStream 类详解

GZIPInputStream 类详解 GZIPInputStream 是 Java 中用于解压缩 GZIP 格式数据的流类,属于 java.util.zip 包。它是 InflaterInputStream 的子类,专门处理 GZIP 压缩格式(.gz 文件)。 1. 核心功能 解压 GZIP 格式数据(RFC 1952 标准)自动处理 GZIP 头尾信息(校验和、时…

网络编程——TCP和UDP详细讲解

文章目录 TCP/UDP全面详解什么是TCP和UDP&#xff1f;TCP如何保证可靠性&#xff1f;1. 序列号&#xff08;Sequence Number&#xff09;2. 确认应答&#xff08;ACK&#xff09;3. 超时重传&#xff08;Timeout Retransmission&#xff09;4. 窗口控制&#xff08;Sliding Win…