当前位置: 首页 > article >正文

跟我学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.lryc.cn/news/2403739.html

相关文章:

  • 什么是DevOps智能平台的核心功能?
  • Windows账户管理,修改密码,创建帐户...(无需密码)
  • 软件功能模块归属论证方法
  • 【Java后端基础 005】ThreadLocal-线程数据共享和安全
  • 【C语言】C语言经典小游戏:贪吃蛇(下)
  • NTT印地赛车:数字孪生技术重构赛事体验范式,驱动观众参与度革命
  • 30.【新型数据架构】-区块链数据架构
  • 使用docker 安装Redis 带配置文件(x86和arm)版本
  • 在CSDN发布AWS Proton解决方案:实现云原生应用的标准化部署
  • 小白的进阶之路系列之十----人工智能从初步到精通pytorch综合运用的讲解第三部分
  • [蓝桥杯]整理玩具
  • C++11 Move Constructors and Move Assignment Operators 从入门到精通
  • JavaScript 中的单例内置对象:Global 与 Math 的深度解析
  • 11 - ArcGIS For JavaScript -- 高程分析
  • 通道注意力
  • 2048游戏的技术实现分析-完全Java和Processing版
  • 全国县域统计年鉴PDF-Excel电子版-2022年
  • 平滑技术(数据处理,持续更新...)
  • App 上线后还能加固吗?iOS 应用的动态安全补强方案实战分享(含 Ipa Guard 等工具组合)
  • gitlab CI/CD本地部署配置
  • AI大模型在测试领域应用案例拆解:AI赋能的软件测试效能跃迁的四大核心引擎(顺丰科技)
  • 从零搭建uniapp项目
  • 数据库密码加密
  • GaLore:基于梯度低秩投影的大语言模型高效训练方法详解一
  • OpenCV CUDA模块图像处理------图像融合函数blendLinear()
  • Linux服务器如何安装wps?
  • 图片压缩工具 | 图片生成PDF文档
  • Python的浅拷贝与深拷贝
  • VSCode - VSCode 放大与缩小代码
  • 消息队列处理模式:流式与批处理的艺术