C++20那些事之constexpr与comma expr

news/2024/10/15 21:08:03/

C++20那些事之constexpr与comma expr

C++20 引入了多项新特性,进一步增强了编译时能力和代码安全性。本文将深入探讨两项重要的变更:constexpr 函数中的异常处理以及下标运算符中逗号运算符的弃用

注:懒人版,本节的代码示例与相关文档已更新在星球,感兴趣加入即可。

1. constexpr 函数中支持 try-catch 异常处理的变更

在 C++20 之前,constexpr 函数中不能使用 try-catch 块,这一限制阻碍了一些标准库容器如 std::array 的编译时处理能力。C++20 对此进行了改进,允许在 constexpr 函数中使用 try-catch 块,并且在常量表达式的上下文中忽略这些异常处理结构。当在常量表达式计算中抛出异常时,编译器会报错。

这项改动的主要目的是让标准库中的容器能够支持 constexpr,例如 std::array,同时为将来在编译时支持更多异常处理提供了基础。

示例

constexpr int SafeDivide(int a, int b) {if (b == 0) {throw std::runtime_error("Division by zero!");  // 当除数为0时抛出异常}return a / b;
}constexpr int ComputeQuotient(int x) {try {return SafeDivide(100, x);  // 尝试除法运算} catch (const std::runtime_error&) {return -1;  // 捕获除零异常并返回 -1}
}

上面代码在C++20之前编译不过,那么C++20对这个行为是什么呢,可以猜一下下面两个结果:

static_assert(ComputeQuotient(25) == 4); 
static_assert(ComputeQuotient(0) == -1);
2. 下标运算符中的逗号运算符弃用

C++20 的另一项变更是弃用在下标运算符中使用逗号运算符。在早期的 C++ 版本中,表达式 array[x, y] 中,逗号运算符会使 y 作为下标传递给数组或容器,而 x 被忽略。然而,这种用法会导致代码不易理解,并且妨碍未来多维数组的实现。因此,自 C++20 起,下标运算符中的逗号运算符被弃用,除非使用括号明确指定优先级,如 array[(x, y)]

示例代码

// arr[i, j] = 10;  // C++17 中合法,C++20 中弃用
arr[(i, j)] = 10;  // 使用括号以明确逗号的优先级

在这个例子中,arr[(i, j)] 使用了括号以明确逗号运算符的优先级,确保 j 作为下标传递给数组。在 C++17 中,arr[i, j] 是允许的,但在 C++20 中,这样的用法会触发弃用警告。通过这种方式可以确保代码的行为一致,并符合 C++20 的新标准。

如果使用了逗号运算符编译器将会警告:

common.cc:9:10: warning: top-level comma expression in array subscript is deprecated [-Wcomma-subscript]9 |     arr[i, j] = 10;  // C++17 中合法,C++20 中弃用|          ^

总结

C++20 中的这些变更,特别是 constexpr 函数中的异常处理支持和下标运算符中逗号运算符的弃用,都是为了提升编译时能力和代码的可读性。如果你的代码依赖这些旧特性,建议及时进行调整,以适应 C++20 的新标准。

一起探索更多C++项目/知识~

b6187b0538761d0d60cdef4a9c14098b.png

往期推荐:

向量数据库milvus源码剖析之开篇

热度更新,手把手实现工业级线程池

玩转cpp小项目星球3周年了!

e95d0e163d4b6ee2e8c3d64698e89997.jpeg


http://www.ppmy.cn/news/1539617.html

相关文章

【氮化镓】低温对p-GaN HEMT迁移率、阈值电压和亚阈值摆幅的影响

本期分享一篇低温对p-GaN HEMT 迁移率、阈值电压和亚阈值摆幅影响进行表征和建模的研究论文。文章作者Shivendra Kumar Singh、Thien Sao Ngo、Tian-Li Wu(通讯作者)和Yogesh Singh Chauhan,分别来资源中国台湾阳明交通大学国际半导体技术学院、印度理工学院坎普尔分校电气工…

多层嵌套json字符串(jsonStr)写入redis

1、连接redis Jedis jedis new Jedis("localhost", 6379); 2、将字符串转为json格式 JSONObject jsJSONObject.fromObject(jsonStr); 3、对json格式进行解析 4、将json写入redis public static void RedisSet(JSONObject js,Jedis js01){ //获取json中的所有ke…

大模型推理框架选型调研

文章目录 背景选型评估指标推理性能推理优化支持程度易用性与学习成本可持续维护性技术兼容性 技术备选老牌新贵 分析TensorRT-LLMNvidia Triton Inference ServerTensorRT-LLM 与 vLLM 对比 建议与结论 背景 公司需要新增了 GPU 机器自部署大模型服务用于支撑 AI 业务。目前市…

边缘计算网关助力软件开发商轻松对接各类工业硬件设备

近年来,工业互联网蓬勃发展,软件开发商面临着如何快速、高效地对接种类繁多的工业硬件设备的巨大挑战。传统方法不仅开发周期长、成本高,而且维护难度大。OkEdge边缘计算网关的出现,为软件开发商提供了一种全新的解决方案&#xf…

【MySQL数据库】MySQL事务

文章目录 MySQL事务事务的四个基本特性(ACID)1. 原子性(Atomicity)2. 一致性(Consistency)3. 隔离性(Isolation)4. 持久性(Durability) 事务的应用场景事务的…

uniapp学习(004-1 组件 Part.1)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第26p-第p30的内容 文章目录 uniapp和vue差异对比写几个组件并且引用props传值添加类型约束约束类型并且添加默…

【宝可梦】游戏

pokemmo https://pokemmo.com/zh/ 写在最后:若本文章对您有帮助,请点个赞啦 ٩(๑•̀ω•́๑)۶

Jgit的使用

Jgit的使用 文章目录 Jgit的使用一,git操作的对应代码1.1 查看操作1.1.1 打开仓库1.1.3 获取状态信息 1.2 添加操作1.2.1 初始化本地仓库1.2.2 创建一个新文件并写入内容1.2.3 添加指定(所有)文件到暂存区1.2.4 提交操作1.2.5 连接并推送到远…