跟我学c++中级篇——理解类型推导和C++不同版本的支持

news2025/6/8 4:51:20

一、类型推导

在前面反复分析过类型推导(包括前面提到的类模板参数推导CTAD),类型推导其实就是满足C++语言这种强类型语言的要求即编译期必须确定对象的数据类型。换一句话说,理论上如果编译器中能够自动推导所有的相关数据类型,也就是能够满足所有的情况,那么,C++编程就不会是现在这么难了。
在现在的C++标准中,包括最新的标准内,所有的类型推导其实都是有着严格的限制条件的。所以,这种自动推导就已经无法很简单的应用。从早期的简单的推导到中期的SFINAE技术再到最新的概念等控制等,其实都只是在进步,而未达到简单方便的地步。
类型推导对强类型语言来说是一种非常重要的技术,特别是对于C++这种与反射天然不契合的语言来说,更是重要。如果有一天,C++语言可以轻松的原生支持反射后,这种类型推导,也就变得相对简单多了。

二、C++11中的类型推导

在C++11标准中,做为第一个变化非常大的标准的演进,最主要的是auto和decltype两种类型推导的方法。特别是auto,新的程序员可能还没有什么问题,老的程序员可就要明白它与早期的auto的不同。最重的反而是decltype,这个关键字可以用来处理表达式的类型,当然也可以处理基础的数据类型。
一般来说auto是根据初始化过程中的数据类型来推导相关数据类型而decltype则根据表达式的类型(一定要明白,表达式和数据类型变量的关系)。
同样,C++11中提供了‌std::declval这个模板函数,它提供了一个不需要构造即可获取对象类型的方法,在某些场景下(如纯虚类等)可以与decltype等共同进行更方便的类型推导。

三、C++14和17中的类型推导

C++14做为一个小版本的标准演进,进一步增强了auto的应用,特别是表达式也可以使用auto,比如Lambada表达也可以使用auto。同时,解决了前面提到过的拖尾类型,即decltype(auto)的使用。
在C++17中,引入了类模板参数的自动推导,也就是说,不必再显示的指定模板参数,而是可以根据发现的构造函数来进行自动的推导并构造。另外,结构化绑定的引入做为一种新的初始化或者说解构的方式,更好的发展了auto的应用。同样也进一步提高了Lambada表达式中对auto变量的捕获能力。或者,往回看就会发现,auto的应用在不断的提升,应用的场景也在不断的普及,这才是标准发展的方向。

四、C++20中的类型推导

在C++20中,最让人瞩目的就是概念(Concepts)以及约束(Requires),而这两种控制手段则极大的增强了对数据类型推导的控制。另外,做为C++标准演进过程最重要的一部分coroutines(协程),也极大的支持了对数据类型推导情况。不过,这种推导是内部实现控制的,而且协程的应用一直没有被普及,所以目前大家暂时还可以不用给自己太多压力。
最后,在C++20前模板的推导可能需要自定义推导规则,但在此之后,这种情况会越来越少,大多数编译器可自动推导出来。

本文中提到的各自推导技术和方法(包括CTAD),都在前面有过具体的分析说明和举例,此处只是为了整体贯连起来,就不再反复举例了。当然,在C++标准文档中对CTAD也有更详细的说明,如果有兴趣可以去查看。

五、总结

在前面反复分析过相关的类型推导技术,大家应该对其的复杂和难度有了一定的了解。不过,这种数据类型推导,对大多数的开发者来说并没有什么感觉。因为普通的推导一般都是编译器自行完成的,只有到模板和元编程技术中,才会主动的进行类型推导的控制或者说出现了自动推导的错误,这其实才是类型推导的真正的复杂之处。
大家可根据自己所处的实际情况,有针对性的进行数据类型推导的学习和实践,而不需要一定掌握到某种深度的程度。

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

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

相关文章

什么是DevOps智能平台的核心功能?

在数字化转型的浪潮中,DevOps智能平台已成为企业提升研发效能、加速产品迭代的核心工具。然而,许多人对“DevOps智能平台”的理解仍停留在“自动化工具链”的表层概念。今天,我们从一个真实场景切入:假设你是某互联网公司的技术负…

Windows账户管理,修改密码,创建帐户...(无需密码)

前言 我们使用wWindows操作系统时,账户是非常重要的概念 它不仅能够帮助我们区分文档主题权限等等 嗯还有最重要的解锁电脑的作用! 但想要管理他,不仅需要原本的密码,而且设置中的管理项也非常的不全。 Windows有一款netplwi…

【Java后端基础 005】ThreadLocal-线程数据共享和安全

📚博客主页:代码探秘者 ✨专栏:文章正在持续更新ing… ✅C语言/C:C(详细版) 数据结构) 十大排序算法 ✅Java基础:JavaSE基础 面向对象大合集 JavaSE进阶 Java版数据结构JDK新特性…

【C语言】C语言经典小游戏:贪吃蛇(下)

文章目录 一、游戏前准备二、游戏开始1、游戏开始函数(GameStart)1)打印欢迎界⾯(WelcomeToGame)2)创建地图(CreateMap)3)初始化蛇⾝(InitSnake)4…

NTT印地赛车:数字孪生技术重构赛事体验范式,驱动观众参与度革命

引言:数字孪生技术赋能体育赛事,开启沉浸式观赛新纪元 在传统体育赛事观赛模式遭遇体验天花板之际,NTT与印地赛车系列赛(NTT INDYCAR SERIES)的深度合作,通过数字孪生(Digital Twin&#xff09…

30.【新型数据架构】-区块链数据架构

30.【新型数据架构】-区块链数据架构:分布式账本,不可篡改性,用于数据溯源 一、区块链数据架构的本质:分布式账本的革新 区块链的核心是分布式账本技术(Distributed Ledger Technology, DLT),它颠覆了传统中心化数据库的架构模式: 去中心化存储: 账本数据不再集中存储…

在CSDN发布AWS Proton解决方案:实现云原生应用的标准化部署

引言:云原生时代的部署挑战 在云原生应用开发中,基础设施管理的复杂性已成为团队面临的核心挑战。随着微服务架构的普及,每个服务可能包含数十个AWS资源(如Lambda、API Gateway、ECS集群等),传统的手动配置…

C++11 Move Constructors and Move Assignment Operators 从入门到精通

文章目录 一、引言二、基本概念2.1 右值引用(Rvalue References)2.2 移动语义(Move Semantics) 三、移动构造函数(Move Constructors)3.1 定义和语法3.2 示例代码3.3 使用场景 四、移动赋值运算符&#xff…

11 - ArcGIS For JavaScript -- 高程分析

这里写自定义目录标题 描述代码实现结果 描述 高程分析是地理信息系统(GIS)中的核心功能之一&#xff0c;主要涉及对地表高度数据(数字高程模型, DEM)的处理和分析。 ArcGIS For JavaScript4.32版本的发布&#xff0c;提供了Web端的针对高程分析的功能。 代码实现 <!doct…

通道注意力

一、 什么是注意力 其中注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器&#xff0c;就像人类视觉会自动忽略背景&#xff0c;聚焦于图片中的主体&#xff08;如猫、汽车&#xff09;。 transformer中的叫做自注意力机制&#xff0c;他是一种自己学习自己的机制…

2048游戏的技术实现分析-完全Java和Processing版

目录 简介Processing库基础项目构建指南项目结构核心数据结构游戏核心机制图形界面实现性能优化代码详解设计模式分析测试策略总结与展望简介 2048是一款由Gabriele Cirulli开发的经典益智游戏。本文将深入分析其Java实现版本的技术细节。该实现使用了Processing库来创建图形界…

全国县域统计年鉴PDF-Excel电子版-2022年

全国县域统计年鉴PDF-Excel电子版-2022年.ziphttps://download.csdn.net/download/2401_84585615/89784662 https://download.csdn.net/download/2401_84585615/89784662 《中国县域统计年鉴》是一部全面反映中国县域社会经济发展状况的资料性年鉴。自2014年起&#xff0c;该年…

gitlab CI/CD本地部署配置

背景: 代码管理平台切换为公司本地服务器的gitlab server。为了保证commit的代码至少编译ok&#xff0c;也为了以后能拓展test cases&#xff0c;现在先搭建本地gitlab server的CI/CD基本的编译job pipeline。 配置步骤&#xff1a; 先安装gitlab-runner: curl -L "ht…

AI大模型在测试领域应用案例拆解:AI赋能的软件测试效能跃迁的四大核心引擎(顺丰科技)

导语 5月份QECon深圳大会已经结束&#xff0c;继续更新一下案例拆解&#xff0c;本期是来自顺丰科技。 文末附完整版材料获取方式。 首先来看一下这个案例的核心内容&#xff0c;涵盖了测四用例设计、CI/CD辅助、测试执行、监控预警四大方面&#xff0c;也是算大家比较熟悉的…

从零搭建uniapp项目

目录 创建uni-app项目 基础架构 安装 uni-ui 组件库 安装sass依赖 easycom配置组件自动导入 配置view等标签高亮声明 配置uni-ui组件类型声明 解决 标签 错误 关于tsconfig.json中提示报错 关于非原生标签错误&#xff08;看运气&#xff09; 安装 uview-plus 组件库…

OpenCV CUDA模块图像处理------图像融合函数blendLinear()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数执行 线性融合&#xff08;加权平均&#xff09; 两个图像 img1 和 img2&#xff0c;使用对应的权重图 weights1 和 weights2。 融合公式…

图片压缩工具 | 图片生成PDF文档

OPEN-IMAGE-TINY&#xff0c;一个基于 Electron VUE3 的图片压缩工具&#xff0c;项目开源地址&#xff1a;https://github.com/0604hx/open-image-tiny ℹ️ 需求描述 上一版本发布后&#xff0c;有用户提出想要将图片转换&#xff08;或者说生成更为贴切&#xff09;PDF文档…

VSCode - VSCode 放大与缩小代码

VSCode 放大与缩小代码 1、放大 点击顶部菜单栏【查看】 -> 点击外观 -> 点击【放大】 或者&#xff0c;使用快捷键&#xff1a;Ctrl # 操作方式先按住 Ctrl 键&#xff0c;再按 键2、缩小 点击顶部菜单栏【查看】 -> 点击外观 -> 点击【缩小】 或者&#x…

11-Oracle 23ai Vector Embbeding和ONNX

Embedding &#xff08;模型嵌入&#xff09;是 AI 领域的一个核心概念 一、Embedding&#xff08;嵌入&#xff09;的含义 Embedding 是一种将 非结构化数据​&#xff08;如文本、图像、音频、视频&#xff09;转换为 数值向量的技术。 其核心是通过 嵌入模型​&#xff08;…

OpenCV 图像色彩空间转换与抠图

一、知识点: 1、色彩空间转换函数 (1)、void cvtColor( InputArray src, OutputArray dst, int code, int dstCn 0, AlgorithmHint hint cv::ALGO_HINT_DEFAULT ); (2)、将图像从一种颜色空间转换为另一种。 (3)、参数说明: src: 输入图像&#xff0c;即要进行颜…