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

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

相关文章:

  • 如何在Lyra中创建一个新的Game Feature Plugin和Experience游戏体验
  • 前端flex、grid布局
  • idea中 maven 本地仓库有jar包,但还是找不到,解决打包失败和无法引用的问题
  • AC68U刷梅林384/386版本后不能 降级回380,升降级解决办法
  • day35-系统编程之网络编程IV及MQTT协议
  • docker数据管理
  • hot100 -- 8.二叉树系列
  • 父组件prop传向子组件的值,被子组件直接v-model绑定 功能不生效
  • JavaWeb笔记
  • 每日八股文6.6
  • kafka消息积压排查
  • 深入理解指针(二)
  • 我爱学算法之—— 前缀和(中)
  • echarts树状图与vue3
  • 【机械视觉】Halcon—【十一、车牌检测和筛子检测】
  • Oracle 用户名大小写控制
  • CSS6404L 在物联网设备中的应用优势:低功耗高可靠的存储革新与竞品对比
  • PyQt6 GUI应用程序开发实操指南
  • 2025最新VMware17如何通过官网进行下载
  • 中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点
  • 车辆测试数据采集解决方案:同步支持总线协议、模拟传感与远程监控的关键技术
  • 理解JavaScript中map和parseInt的陷阱:一个常见的面试题解析
  • Excel 表格内批量添加前缀与后缀的实用方法
  • 区块链可投会议CCF A--SP 2026 截止11.13 附录用率
  • 在MyBatis中设计SQL返回布尔值(Boolean)有几种常见方法
  • Python数学可视化:3D参数曲面与隐式曲面绘制技术
  • Skia如何绘制几何图形
  • Linux驱动学习day2
  • vm+ubuntu24.04扩展磁盘
  • Ubuntu创建修改 Swap 文件分区的步骤——解决嵌入式开发板编译ROS2程序卡死问题