
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
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight All Rights Reserved.
Powered By 61893.com 闽ICP备11008920号
闽公网安备35020302034844号