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

一、类型推导

在前面反复分析过类型推导(包括前面提到的类模板参数推导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.pswp.cn/news/908406.shtml

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

相关文章

vue3+TS+eslint9配置

记录eslint升级到9.x的版本之后遇到的坑 在 ESLint 9 中,配置方式发生了变化。Flat Config 格式(eslint.config.js 或 .ts)不再支持 extensions 选项。所以vscode编辑器中的 extensions 需要注释掉,要不然保存的时候不会格式化。…

书籍推荐 --- 《筚路维艰:中国经济社会主义路径的五次选择》

萧冬连.筚路维艰:中国社会主义路径的五次选择[M]. 前不久看完的这本书,还是蛮受震撼的。 这本书比较细致地(引用了很多的史料)、从中央高层的视角讲解了从新中国成立一直到改革开放初期这30多年里(1949---1980年代)发生在我国的几次重大事件(三大改造、第一个五年计…

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序&#xff…

(三)动手学线性神经网络:从数学原理到代码实现

1 线性回归 线性回归是一种基本的预测模型,用于根据输入特征预测连续的输出值。它是机器学习和深度学习中最简单的模型之一,但却是理解更复杂模型的基础。 1.1 线性回归的基本元素 概念理解: 线性回归假设输入特征和输出之间存在线性关系。…

二十五、面向对象底层逻辑-SpringMVC九大组件之HandlerMapping接口设计

一、引言:MVC架构的交通枢纽 在Spring MVC框架中,HandlerMapping接口扮演着"请求导航仪"的关键角色,它决定了HTTP请求如何被路由到对应的Controller处理器。作为MVC模式的核心组件之一,HandlerMapping在请求处理的生命…

凌晨四点的星光

凌晨四点的城市像台停止运转的老旧机器,陈明裹紧外套踩着路灯的残影往家走。键盘敲击声仿佛还在耳边回响,他揉了揉酸涩的眼睛,手机屏幕突然亮起,是妻子发来的消息:“孩子又发烧了,我带他去医院。” 这是他…

Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁

Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁

LeetCode 热题 100 74. 搜索二维矩阵

LeetCode 热题 100 | 74. 搜索二维矩阵 大家好,今天我们来解决一道经典的算法题——搜索二维矩阵。这道题在 LeetCode 上被标记为中等难度,要求我们在一个满足特定条件的二维矩阵中查找一个目标值。如果目标值在矩阵中,返回 true&#xff1b…

如何在 HTML 中添加按钮

原文:如何在 HTML 中添加按钮 | w3cschool笔记 (请勿将文章标记为付费!!!!) 在网页开发中,按钮是用户界面中不可或缺的元素之一。无论是用于提交表单、触发动作还是导航&#xff0…

一篇文章实现Android图片拼接并保存至相册

系列文章目录 一篇文章实现Android图片拼接并保存至相册 文章目录 系列文章目录前言实现功能类定义和成员变量onCreate方法权限检查和图片选择处理选择的图片图片拼接功能图片保存功能 使用ImageStitcher类拼接图片代码解释:ImageStitcher.java类定义和方法计算拼接…

2025.06.06【Ribo-seq】|riboWaltz:P-site定位与三碱基周期性分析流程

文章目录 一、前言二、riboWaltz简介三、安装与依赖四、分析流程总览1. 数据准备2. 典型分析流程2.1 读取注释和BAM2.2 P-site定位2.3 三碱基周期性与元分析2.4 密码子使用偏好分析 五、可视化与结果解读六、常见问题与注意事项七、实战经验与建议八、参考资料九、结语 一、前言…

思维链的 内部机制和简单理解

思维链的 内部机制和简单理解 思维链是对解决问题的步骤进行规划,规划后将作为上下文 在LLM中继续输出。因为Transform都是一个一个单词生成,没新生成一个单词都会将新生的作为上下文。 可以这么理解,但更准确的简化描述是: 思维链是让模型在回答问题时,先“内部生成”或…

Charles 全流程指南:安装、设置、抓包与注意事项

Charles 是一款功能强大的网络抓包工具,支持 HTTP/HTTPS 流量监控、请求/响应分析、断点调试等功能。本文将从安装到实战抓包,提供完整流程及关键注意事项。 一、安装 Charles 官网下载:访问 Charles 官网,选择对应系统版本&…

全球长序列高分辨率光合有效辐射(PAR)(1984-2018)

时间分辨率:时空间分辨率:1km - 10km共享方式:开放获取数据大小:188.92 GB数据时间范围:1984-01-01 — 2018-12-31元数据更新时间:2022-04-29 数据集摘要 本数据集是一个包含接近35年(1984-201…

【Zephyr 系列 11】使用 NVS 实现 BLE 参数持久化:掉电不丢配置,开机自动加载

🧠关键词:Zephyr、NVS、非易失存储、掉电保持、Flash、AT命令保存、配置管理 📌目标读者:希望在 BLE 模块中实现掉电不丢配置、支持产测参数注入与自动加载功能的开发者 📊文章长度:约 5200 字 🔍 为什么要使用 NVS? 在实际产品中,我们经常面临以下场景: 用户或…

解锁Java线程池:性能优化的关键

一、引言 在 Java 并发编程的世界里,线程池是一个至关重要的概念。简单来说,线程池就是一个可以复用线程的 “池子”,它维护着一组线程,这些线程可以被重复使用来执行多个任务,而不是为每个任务都创建一个新的线程。​…

一站式直播工具:助力内容创作者高效开启直播新时代

近年来,随着互联网技术的不断进步和短视频、直播行业的爆发式增长,越来越多的企业和个人投入到直播电商、互动娱乐、在线教育等场景。直播运营过程中,涉及到数据统计、弹幕互动、流程自动化、内容同步等诸多环节。如何提升运营效率、减少人工…

数论——同余问题全家桶3 __int128和同余方程组

数论——同余问题全家桶3 __int128和同余方程组 快速读写和__int128快速读写__int128 中国剩余定理和线性同余方程组中国剩余定理(CRT)中国剩余定理OJ示例模板题曹冲养猪 - 洛谷模板题猜数字 - 洛谷 扩展中国剩余定理扩展中国剩余定理OJ示例模板题扩展中国剩余定理(…

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…

㊗️高考加油

以下是极为详细的高考注意事项清单,涵盖考前、考中、考后全流程,建议逐条核对: 一、考前准备 1. 证件与物品 必带清单: 准考证:打印2份(1份备用),塑封或夹在透明文件袋中防皱湿。身…