c++中的auto关键字

在 C++ 中,auto 是一个类型推断关键字(C++11 引入),允许编译器根据变量的初始化表达式自动推导其类型。它极大地简化了代码编写,尤其在涉及复杂类型或模板的场景中。以下是 auto 的详细说明:


1. 基本用法

1.1 变量声明
auto x = 42;          // x 被推导为 int
auto y = 3.14;        // y 被推导为 double
auto str = "hello";   // str 被推导为 const char*
  • 规则auto 的类型由初始化表达式的类型决定。

  • 初始化必须存在auto 变量必须立即初始化,否则编译器无法推导类型。

1.2 引用和常量
int a = 10;
auto &ref = a;        // ref 是 int& 类型
const auto pi = 3.14; // pi 是 const double 类型
auto ptr = &a;        // ptr 是 int* 类型
  • 可通过 &*const 等修饰符显式控制推导类型。


2. 核心优势

2.1 简化复杂类型
  • 场景:处理迭代器、模板或嵌套类型时,auto 可避免冗长的类型名。

std::vector<std::map<int, std::string>> data;
// 传统方式(冗长)
std::vector<std::map<int, std::string>>::iterator it = data.begin();
// 使用 auto(简洁)
auto it = data.begin();
2.2 泛型编程
  • 在模板函数中,auto 可配合 decltype 或 C++14 的 auto 返回值实现灵活的类型适配。

template <typename T, typename U>
auto add(T a, U b) -> decltype(a + b) { // C++11 后置返回类型return a + b;
}
// C++14 允许直接使用 auto 推断返回类型
auto add(T a, U b) {return a + b;
}
2.3 基于范围的循环
  • 遍历容器时,auto 可自动适配元素类型。

std::vector<int> vec = {1, 2, 3};
for (auto num : vec) {        // num 是 int 类型(拷贝)std::cout << num << " ";
}
for (const auto &num : vec) { // 常量引用,避免拷贝std::cout << num << " ";
}

3. 注意事项

3.1 类型推导规则
  • 引用和常量丢失auto 默认会忽略顶层 const 和引用,需显式声明:

    const int a = 10;
    auto b = a;       // b 是 int(忽略 const)
    auto &c = a;      // c 是 const int&
3.2 auto 与初始化列表
  • 直接初始化列表需使用 auto 的特殊处理:

    auto list = {1, 2, 3}; // list 被推导为 std::initializer_list<int>

3.3 函数参数的限制
  • C++20 前auto 不能用于函数参数类型(C++20 允许 auto 参数,但需通过 concepts 约束)。

  • C++20 示例

    void print(auto value) { // 类似于模板函数std::cout << value;
    }
    


4. 适用场景

4.1 推荐使用
  • 迭代器和模板代码:减少冗余类型声明。

  • Lambda 表达式:结合 auto 存储 lambda 对象:

    auto lambda = [](int x) { return x * 2

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

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

相关文章

开发指南111-关闭所有打开的子窗口

门户系统是通过window.open通过单点登录的模式打开子系统的&#xff0c;这就要求门户系统退出时&#xff0c;关闭所有打开的子系统。 平台处理这一问题的核心原理如下&#xff1a; 主窗口定义&#xff1a; allChildWindows:[], //所有子窗口 pushChildWindow(childWindow){ …

Kotlin语言进阶:协程、Flow、Channel详解(二)

Kotlin语言进阶:协程、Flow、Channel详解(二) 一、Flow基础 1.1 什么是Flow Flow是Kotlin提供的用于处理异步数据流的解决方案,它建立在协程之上,具有以下特点: 冷流特性:只有在收集时才会开始发射数据背压处理:自动处理生产者和消费者速度不匹配的问题组合操作:提…

mysql中my.cnf权限不能过大。否则无法生效

mysql 报错 World-writable config file ‘/etc/my.cnf‘ is ignored. /etc/my.cnf 配置文件, 或着docker 挂载的配置文件(宿主机中的配置文件),权限过大 如是二进制启动 chmod 644 /etc/my.cnf 如是docker启动 chmod 644 /opt/docker-data/mysql/conf/my.cnf 重启服务,就可…

Spring 中的 @Autowired 和 @Resource

&#x1f9e9; 一、Autowired 和 Resource 的基本作用 注解来源作用AutowiredSpring 提供&#xff08;org.springframework.beans.factory.annotation.Autowired&#xff09;按类型 自动注入ResourceJDK 提供&#xff08;javax.annotation.Resource&#xff09;默认按名称 注入…

anomalib—2—输入图像大小调整

三个地方 第一&#xff1a;在定义model时&#xff0c;要在pre_processor里面去定义一个前处理&#xff0c;前处理就一个功能&#xff0c;定义图像的大小 pre_processor0 Patchcore.configure_pre_processor( image_size (128, 128)) model Patchcore( backbone"wide_r…

JSX、支持HTML标签、Ref的使用、虚拟DOM的使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

JVM 学习计划表(2025 版)

JVM 学习计划表&#xff08;2025 版&#xff09; &#x1f4da; 基础阶段&#xff08;2 周&#xff09; 1. JVM 核心概念 ​JVM 作用与体系结构 理解 JVM 在 Java 跨平台运行中的核心作用&#xff0c;掌握类加载子系统、运行时数据区、执行引擎的交互流程​内存结构与数据存…

进程内存分布--之理论知识

一个由C/C编译的程序占用的内存分为以下几个部分 &#xff1a; 1、栈区&#xff08;stack&#xff09;&#xff1a;由编译器自动分配释放 &#xff0c;存放函数调用函数的参数值&#xff0c;局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区&#xff08;heap&#xf…

WEB安全--内网渗透--LMNTLM基础

一、前言 LM Hash和NTLM Hash是Windows系统中的两种加密算法&#xff0c;不过LM Hash加密算法存在缺陷&#xff0c;在Windows Vista 和 Windows Server 2008开始&#xff0c;默认情况下只存储NTLM Hash&#xff0c;LM Hash将不再存在。所以我们会着重分析NTLM Hash。 在我们内…

时尚优雅奢华品牌包装徽标设计衬线英文字体安装包 Kagea – Luxury Women Ligature Font

Kagea 是一种复杂的衬线字体&#xff0c;有常规和压缩两种样式&#xff0c;具有 50 连字和替代字体&#xff0c;并支持多种语言。其精致的比例和别致的字体使其成为高端品牌、编辑布局、高档包装、时尚品牌和奢侈品设计的理想选择。 包含内容&#xff1a; TTF、OTF 和 WOFF 格…

cut命令用法

cut 是 Linux/Unix 系统中一个用于按列提取文本内容的命令&#xff0c;常用于处理结构化文本&#xff08;如 CSV、日志、配置文件等&#xff09;。它通过分隔符、字符位置或字节位置来切割文本&#xff0c;提取指定部分。 核心功能 按字段&#xff08;列&#xff09;提取&#…

美国mlb与韩国mlb的关系·棒球9号位

MLB&#xff08;Major League Baseball&#xff0c;美国职业棒球大联盟&#xff09;作为全球最高水平的职业棒球联赛&#xff0c;与韩国市场流行的“MLB”时尚品牌之间存在着授权合作关系&#xff0c;但两者在业务范畴和品牌定位上存在显著差异。 一、品牌授权背景&#xff1a;…

从吉卜力漫画到艺术创造:GPT-4o多种风格绘图Prompt大全

在3月底&#xff0c;GPT-4o掀起了一阵吉卜力绘图浪潮&#xff0c;大家纷纷输入一张图片&#xff0c;让4o模型进行风格化迁移&#xff0c;其中吉卜力风格的漫画在社交媒体上最为火热。在大家争议4o的训练数据是否侵权和4o背后的技术原理的时候&#xff0c;我们先来玩一玩&#x…

Leetcode 3510. Minimum Pair Removal to Sort Array II

Leetcode 3510. Minimum Pair Removal to Sort Array II 1. 解题思路2. 代码实现 题目链接&#xff1a;3510. Minimum Pair Removal to Sort Array II 1. 解题思路 这一题和题目3507. Minimum Pair Removal to Sort Array I本质上是同一道题目&#xff0c;唯一的区别在于时间…

【数学建模】(时间序列模型)ARIMA时间序列模型

ARIMA时间序列模型详解及常见时间序列模型概览 文章目录 ARIMA时间序列模型详解及常见时间序列模型概览1 引言2 ARIMA模型的基本概念3 ARIMA模型的组成部分详解3.1 AR模型 (自回归模型)3.2 MA模型 (移动平均模型)3 I (差分) 4 ARIMA模型的建模步骤5 Python实现ARIMA模型6 常见时…

嵌入式AI开发者职业成长路线图

嵌入式AI开发者职业成长路线图 一、核心技术能力构建 1. 深度学习框架 TensorFlow/TensorFlow Lite&#xff1a;适合部署到嵌入式设备PyTorch&#xff1a;研究和原型开发ONNX&#xff1a;模型转换与部署 2. 模型理解与应用 卷积神经网络(CNN)&#xff1a;图像识别、目标检…

单元测试之mockito

简介 mockito是一款模拟测试框架&#xff0c;用于Java开发中的单元测试。通过mockito&#xff0c;可以创建和配置一个对象&#xff0c;通过它来替换对象的外部依赖。 作用&#xff1a;模拟一个类的外部依赖&#xff0c;保证单元测试的独立性。例如&#xff0c;在类A中会调用类…

Oracle数据库数据编程SQL<5 正则表达式函数*****>

Oracle 提供了一组强大的正则表达式函数,用于在 SQL 和 PL/SQL 中进行复杂的模式匹配和文本处理。这些函数基于 POSIX 标准正则表达式,功能强大且灵活。 目录 一、Oracle 正则表达式函数概览 二、函数详解及示例 1. REGEXP_LIKE 2. REGEXP_INSTR 3. REGEXP_SUBSTR 4. …

el-tabs添加按钮增加点击禁止样式

前置文章 一、vue使用element-ui自定义样式思路分享【实操】 二、vue3&ts&el-tabs多个tab表单校验 现状确认 点击添加按钮&#xff0c;没有点击样式&#xff0c;用户感知不明显没有限制最大的tab添加数量&#xff0c;可以无限添加 调整目标&代码编写 调整目标…

DB-Mysql中TIMESTAMP与DATETIME的区别

文章目录 ‌存储范围‌‌时区处理‌存储空间‌默认值和自动更新‌‌零值处理‌适用场景‌总结 在MySQL中&#xff0c;TIMESTAMP和DATETIME是两种常用的日期时间数据类型&#xff0c;它们虽然都用于存储日期和时间&#xff0c;但在多个方面存在显著差异。以下是它们的主要区别&a…