C++26标准获得批准,合约功能引发争议

ISO C++委员会(WG21)已批准C++26标准,委员会成员赫布·萨特称其为自C++11以来最引人注目的版本,其中包含合约功能,尽管C++发明者比雅尼·斯特劳斯特鲁普等人对此功能表示反对。

委员会在伦敦克罗伊登召开会议,并于3月28日批准了该标准。根据萨特的报告,下一阶段将准备最终文档并提交国际审批。C++通常每三年发布一个新标准,委员会还通过了C++29的时间表,相关工作已经开始。

萨特表示,合约是C++26的主要功能之一。合约是在函数声明中设置前置条件和后置条件,以及在函数内添加断言语句的一种方式。该功能旨在帮助使C++代码更加安全可靠。

描述C++26合约的论文指出,"在试图为C++添加合约功能的背后,有着漫长而传奇的历史。"合约也是C++20工作草案的一部分,但WG21在2019年因提议设计的重大变更而将其移除。

C++26提案将自己描述为为C++26制作最小可行产品计划的巅峰之作。仍存在一些不足,例如不支持虚函数上的合约,但这预计会在未来版本中得到解决。

萨特是合约的支持者,在科罗拉多州奥罗拉举行的CppCon 2025上就"C++26合约的乐趣"发表演讲。

斯特劳斯特鲁普并不认同这一观点,他在去年关于C++26合约陷阱的演讲中表示:"据称这是一个最小可行产品。但它既不最小,也不可行。"

斯特劳斯特鲁普说他将建议不要在C++中使用合约。"这以非常晦涩的方式增加了复杂性。它根据代码所在位置改变代码的含义……我非常担心这种复杂性,担心我们是否能够正确使用它。"

萨特指出,一些"聪明且受人尊敬的ISO C++委员会成员对合约持续存在技术担忧。"正因如此,最终确定C++26标准的投票并非一致通过,有114票赞成,12票反对,3票弃权。然而,萨特表示"ISO C++委员会仍然需要合约,因此合约保留在C++26中。"

C++26还包括编译时反射,允许在没有任何运行时开销的情况下检查和生成代码。这与Java或C#中在运行时工作的反射不同。萨特称其为"C++有史以来表达高效抽象的最强大新引擎。"

萨特还谈到了C++在内存安全方面的改进,例如为未初始化读取定义错误行为。在C++中,未定义行为(UB)是错误和漏洞的主要原因,因此委员会的目标是减少它,这就是这种努力的一个例子。

C++26标准库得到了加固,萨特表示,在谷歌实施时,它修复了一千多个错误,并"将生产车队的段错误率降低了30%。"

另一个重要功能是std::execution,它为异步执行提供了一个框架,不过萨特警告说,由于文档不完善和缺乏完整的库支持,它比大多数C++功能"更难采用"。

Q&A

Q1:C++26标准中的合约功能是什么?

A:合约是在函数声明中设置前置条件和后置条件,以及在函数内添加断言语句的一种方式。该功能旨在帮助使C++代码更加安全可靠。不过目前还存在一些不足,例如不支持虚函数上的合约。

Q2:为什么C++发明者反对合约功能?

A:比雅尼·斯特劳斯特鲁普认为合约功能"既不最小,也不可行",会以非常晦涩的方式增加复杂性,还会根据代码所在位置改变代码的含义。他担心这种复杂性以及开发者是否能够正确使用它。

Q3:C++26还有哪些重要的新功能?

A:除了合约功能,C++26还包括编译时反射,允许在没有运行时开销的情况下检查和生成代码;改进的内存安全性,如为未初始化读取定义错误行为;以及std::execution框架,为异步执行提供支持。

展开阅读全文

更新时间:2026-04-04

标签:科技   合约   功能   标准   萨特   斯特劳斯   代码   函数   委员会   复杂性   最小

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight All Rights Reserved.
Powered By 61893.com 闽ICP备11008920号
闽公网安备35020302035593号

Top