在 C++11及后续版本中,关键字autodecltype都是用于类型推导的,但它们的使用场景和行为有所不同。

1. auto 关键字

作用

auto 用于自动推导变量的类型,由编译器根据初始化表达式来确定。

常见用法
// 基本用法
auto x = 42;        // int
auto y = 3.14;      // double
auto z = "hello";   // const char*// 复杂类型简化
std::vector<int> vec = {1, 2, 3};
auto it = vec.begin();  // std::vector<int>::iterator// 函数返回值推导(C++14及以后)
auto add(int a, int b) {return a + b;  // 返回类型为int
}
注意事项
  1. 必须初始化auto 变量必须在定义时初始化,否则编译器无法推导类型。
  2. 引用和 cv 限定符auto 通常会忽略引用和顶层 const,除非显式指定:
    const int& ref = x;
    auto a = ref;    // a是int(忽略引用和顶层const)
    auto& b = ref;   // b是const int&(保留引用和const)
    
  3. 模板类型推导规则auto 使用与模板类型推导相同的规则(T 推导)。

2. decltype 关键字

作用

decltype 用于获取表达式的类型,而不实际计算表达式的值。

常见用法
int x = 42;
decltype(x) y = 0;  // y的类型是int// 复杂类型
std::vector<int> vec;
decltype(vec.size()) size = vec.size();  // std::vector<int>::size_type// 函数返回值类型推导(C++11及以后)
template<typename T, typename U>
auto add(T a, U b) -> decltype(a + b) {return a + b;
}
类型推导规则
  • 变量名decltype(var) 返回变量的声明类型(包括引用和 cv 限定符)。
  • 表达式decltype((var)) 返回引用类型(因为表达式是左值)。
  • 函数调用decltype(func()) 返回函数返回值的声明类型。
int x = 42;
decltype(x) a = x;     // a是int
decltype((x)) b = x;   // b是int&(因为(x)是左值表达式)

3. decltype(auto)(C++14)

作用

decltype(auto) 用于精确推导类型,保留引用和 cv 限定符,通常用于转发函数或返回引用的函数。

int& func(int& x) { return x; }auto a = func(x);        // a是int(丢失引用)
decltype(auto) b = func(x);  // b是int&(保留引用)

4. 对比总结

特性autodecltype
推导依据初始化表达式的类型表达式的类型(不计算值)
引用和 cv 限定符通常忽略顶层 const 和引用保留所有类型信息
适用场景变量定义、函数返回值简化模板元编程、返回类型后置
特殊形式auto&&(通用引用)decltype(auto)(精确推导)

5. 示例

泛型容器遍历
std::map<std::string, int> dict = {{"apple", 1}, {"banana", 2}};
for (const auto& pair : dict) {  // pair是const std::pair<const std::string, int>&// 使用pair.first, pair.second
}
元编程
template<typename T, typename U>
auto max(T a, U b) -> decltype(a > b ? a : b) {return a > b ? a : b;
}

总结

  • auto:适合简化类型名,由初始化表达式推导类型。
  • decltype:适合精确获取表达式的类型,常用于模板元编程或保留引用。
  • decltype(auto):结合两者优点,用于精确转发或返回引用。

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

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

相关文章

LabVIEW机器视觉零件检测

基于LabVIEW 图形化编程平台与机器视觉技术&#xff0c;构建集图像采集、处理、尺寸计算与合格性分析于一体的自动化检测方案。通过模块化硬件架构与自适应算法设计&#xff0c;实现对机械零件多维度尺寸的非接触式高精度测量&#xff0c;相比人工检测效率提升 12 倍&#xff0…

大数据治理域——实时数据开发

摘要 本文深入探讨了大数据治理域中的实时数据开发&#xff0c;重点介绍了流式数据处理的核心价值、特点、技术挑战、典型能力和应用场景。同时&#xff0c;详细阐述了流式技术架构&#xff0c;包括数据采集、处理、存储和服务等环节&#xff0c;并针对大促场景提出了相应的技…

Halcon/C# 图像窗口、读取图片及仿射变换

一、Halcon 清理窗口 清除图像窗口的显示。 dev_clear_window() 二、Halcon 读取图片 (一) 读取一张图片 read_image (Image, printer_chip/printer_chip_01)Image&#xff1a;&#xff08;输出参数&#xff09;读取到的图片变量名 第二个参数&#xff1a;图片路径&#xf…

Nginx 反向代理服务和安装docker-compose

Nginx 反向代理服务和安装docker-compose Nginx Proxy Manager 他是一个可视化的nginx的反向代理神器&#xff0c;动动手指轻松的配置Nginx&#xff0c;我们可以通过一些网页&#xff0c;即可完成网站的代理配置&#xff0c;无需在动手安装Nginx&#xff1b; dockoer-compose部…

FPGA基础 -- Verilog 锁存器简介

由浅入深地讲解 Verilog 中的锁存器&#xff08;Latch&#xff09;**&#xff0c;包括&#xff1a; 什么是锁存器&#xff08;定义与作用&#xff09;锁存器的分类&#xff08;透明锁存器 vs 边沿触发器&#xff09;Verilog 中锁存器的建模方式锁存器与触发器的区别锁存器的时…

Eclipse Memory Analyzer (MAT) 相关配置调整

一、JDK版本过低提示 已安装高于 jdk 17 的版本依旧提示 jdk 版本过低&#xff0c;打开MAT的安装目录&#xff0c;在配置文件 MemoryAnalyzer.ini 中添加配置指向JDK即可。新增两行配置&#xff1a; -vm D:/jdk_21.0.7/bin/javaw.exe //jdk安装路径 bin 目录下的javaw.exe二…

机器学习常用评估指标

机器学习常用评估指标 机器学习的评价指标有精度、精确率、召回率、P-R曲线、F1 值、TPR、FPR、ROC等指标&#xff0c;还有在生物领域常用的敏感性、特异性等指标。 基础 在分类任务中&#xff0c;各指标的计算基础都来自于对正负样本的分类结果&#xff0c;用混淆矩阵表示&…

视频相似度检测算法(带课设报告)

摘 要 本文提出了一种基于关键帧特征提取的视频相似度检测方法&#xff0c;通过融合自适应采样与特征降维技术实现高效准确的视频内容比对。系统采用三阶段处理流程&#xff1a;首先对输入视频进行自适应关键帧采样&#xff0c;通过均匀间隔算法提取固定数量&#xff08;默…

微服务江湖的爱恨情仇:Spring Cloud 与 Kubernetes 的双雄演义

引言&#xff1a;双雄并立&#xff0c;一个时代的序幕 微服务革命&#xff0c;如同一场燎原之火&#xff0c;将庞大、笨重的单体应用烧成灰烬&#xff0c;宣告了一个敏捷、独立、快速迭代的新纪元。然而&#xff0c;这场革命在摧毁旧世界的同时&#xff0c;也催生了一片混沌的新…

深度拆解RAGFlow分片引擎之切片实现

上一篇深度拆解RAGFlow分片引擎&#xff01;3大阶段视觉增强&#xff0c;全网最硬核架构解析 讲了切片的整体流程&#xff0c;今天我们来拆下切片的实现。 我们在设置的时候&#xff0c;可以选择切片方法。这个参数是parser_id 在创建知识库的时候&#xff0c;选择对应的切片方…

CSS平滑滚动效果实现方法

一、纯CSS实现方案 使用 scroll-behavior 属性 属性值 auto (默认值)&#xff1a;滚动框立即滚动smooth&#xff1a;滚动框以平滑的方式滚动 /* 全局平滑滚动 */ html {scroll-behavior: smooth; }/* 特定容器平滑滚动 */ .scroll-container {scroll-behavior: smooth;over…

李沐动手深度学习(pycharm中运行笔记)——12.权重衰退

12.权重衰退&#xff08;与课程对应&#xff09; 目录 一、权重衰退 1、使用均方范数作为硬性限制 2、使用均方范数作为柔性限制&#xff08;通常这么做&#xff09; 3、演示对最优解的影响 4、参数更新法则 5、总结 二、代码实现从零实现 三、代码实现简介实现 一、权重…

React Native【实战范例】同步跟随滚动

最终效果 实现原理 主动滚动区触发滚动事件&#xff0c;原生监听滚动值的变化&#xff0c;并用动画的方式实时同步到跟随滚动区 技术要点 使用 Animated.ScrollView 使用动画变量 const scrollY useRef(new Animated.Value(0)).current;主动滚动触发 onScroll&#xff0c;用 …

如何仅用AI开发完整的小程序<3>—创建小程序基础框架

1、启动小程序开发者工具-选择小程序&#xff0c;点击 2、创建一个项目工程 项目名称&#xff1a;自己填默认的也行&#xff0c;最好不要中文&#xff0c;拼音也行 目录&#xff1a;选择你的项目创建路径 AppID&#xff1a;可以先点测试号&#xff0c;后面再替换自己的AppID就…

SQL等价改写优化

or 与 union all的优化 在SQL开发中&#xff0c;我们经常会遇到这样的情况&#xff1a;需要组合多个相似但略有不同的查询结果。大多数开发者本能地使用UNION/UNION ALL来解决&#xff0c;这种方式直观易懂&#xff0c;但在特定场景下却隐藏着巨大的性能浪费。 本案例将从执行…

【已解决】 数据库INSERT操作时,Column count doesn’t match value count at row 1

【已解决】数据库INSERT操作时&#xff0c;ColumnColumn count doesn’t match value count at row 1 在开发过程中&#xff0c;我们经常会遇到数据库操作错误&#xff0c;其中之一就是 MySQL 中的 “Column count doesn’t match value count at row1” 错误。这个错误通常发…

管件接头的无序抓取

文章目录 1&#xff0c;目的2&#xff0c;过程3&#xff0c;易混易错点4&#xff0c;代码详解4.1&#xff0c;初始化窗口4.2&#xff0c;创建多视角立体视觉模型。4.3&#xff0c;创建表面匹配模型4.4&#xff0c;多视角立体视觉重建管件堆表面模型4.5&#xff0c;管道接头查找…

移远通信 × 紫光展锐,推动FWA “5G+AI”新体验

6月19日&#xff0c;在2025 MWC上海期间&#xff0c;移远通信宣布&#xff0c;携手紫光展锐&#xff0c;推出面向下一代CPE应用的“5GAI”融合解决方案。目前双方正联合多家CPE厂商开展方案深度调优&#xff0c;以加速5GAI CPE终端的产业化落地进程。 该方案以移远5G模组RG620…

深入理解Grad-CAM:用梯度可视化神经网络的“注意力“

深入理解Grad-CAM&#xff1a;用梯度可视化神经网络的"注意力" 引言 在深度学习的发展过程中&#xff0c;模型的可解释性一直是一个重要的研究方向。尽管现代神经网络在图像识别、自然语言处理等任务上取得了令人瞩目的成果&#xff0c;但它们往往被称为"黑盒…

离线环境jenkins构建前端部署镜像

gitlabjenkins 实现前端项目打包成 docker 镜像&#xff1b;gitlab部署就不赘述了&#xff1b;因部署的gitlab版本的webhooks有问题&#xff0c;无法进行配置,所以文章的构建是手动触发的。并且nodejs部署应该也能跟docker一样直接安装进jenkins的镜像(但是多版本可能就有其他问…