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框架,为异步执行提供支持。
好文章,需要你的鼓励
研究人员意外发现,标准MOSFET晶体管可同时模拟神经元和突触行为,形成"神经突触随机存取存储器"(NSRAM)。该技术仅需一至两个晶体管即可实现传统需数十乃至数百个元件才能完成的神经信号处理,且与现有硅基制造工艺完全兼容,良率达100%。未来有望应用于边缘AI及高能效神经形态芯片,长远或可挑战GPU地位。
牛津大学提出PHYSIFORMER,一种扩散变换器模型,通过三维网格顶点轨迹直接在世界坐标空间预测刚性与弹性物体的物理运动,一次性生成全序列轨迹,超越自回归基线。
本文提出一种评估人工智能风险的新方法,借鉴生态学与演化论视角,从理论生态模型中推导出三项风险指标,涵盖种群模型与生态系统模型。研究旨在为AI治理策略提供量化工具,并对分析局限性及政策改进方向进行了深入探讨,为构建更科学的AI风险评估体系提供参考框架。
研究发现主流奖励模型对同等质量答案给出差异悬殊的分数,并提出"奖励聚类"算法通过蒙特卡洛随机失活将连续分数离散化,在不重训模型的前提下有效减少AI训练中的奖励作弊现象。