
负责 C++ 语言标准的 ISO C++ 委员会(WG21)近期批准了 C++26 的标准草案。委员会成员 Herb Sutter 将其描述为自 C++11 以来最引人注目的版本。不过,这个新版本中备受争议的“合约”(Contracts)功能,却遭到了 C++ 创始人 Bjarne Stroustrup 等人的明确反对。
根据 Sutter 的报告,C++26 草案已获得批准,下一步将进入最终文档准备和国际批准流程。C++ 语言通常遵循三年一更新的节奏,与此同时,委员会也已启动 C++29 的开发工作。
合约功能是 C++26 的主要特性之一。它允许开发者在函数声明中设置前提条件(preconditions)和后置条件(postconditions),并在函数内部添加断言语句。这项设计的初衷是提升代码的安全性和可靠性。根据其提案论文中的描述,“为 C++ 添加合约特性的背后有着一段漫长而曲折的历史。” 该特性曾一度被纳入 C++20 的工作草案,后因设计变动在2019年被临时移除。当前的 C++26 提案自称为“为 C++26 打造最小化可行产品(MVP)计划的最终成果”,并承认仍存在不足,例如暂不支持虚函数契约。
作为合约功能的积极倡导者,Herb Sutter 甚至在 CppCon 2025 大会上发表了题为“C++26 合约的乐趣”的演讲。

然而,C++ 创始人 Bjarne Stroustrup 对此持有截然不同的看法。在2025年一次讨论 C++26 合约缺陷的演讲中,他直言不讳地表示:“它被声称是一个最小可行产品。但它既不是最小,也不可行。” Stroustrup 甚至建议不要在 C++ 中使用合约功能,他担忧地指出:“这会以非常晦涩的方式增加复杂性。它会根据代码出现的位置改变其含义……我非常担心这种复杂性,也担心我们是否能够正确使用它。”
Sutter 也承认,一些“聪明且受人尊敬的 ISO C++ 委员会成员对合约机制仍存在技术方面的担忧”。正因如此,C++26 标准草案的最终投票并非全票通过:114票赞成,12票反对,3票弃权。尽管如此,Sutter 表示委员会整体上仍希望保留该机制,因此合约功能最终留在了草案中。
除了合约,C++26 还引入了强大的编译时反射功能。这与 Java 或 C# 等语言在运行时工作的反射机制不同,它允许在编译时检查和生成代码,且不增加运行时开销。Sutter 将其誉为“C++ 有史以来表达高效抽象的最强大的新引擎”。
内存安全性的改进也是 C++26 的重点方向之一。委员会试图通过明确“未初始化读取”等操作的具体错误行为,来减少长期以来因“未定义行为”(UB)而导致的各类错误和漏洞。Sutter 透露,这项改进在 Google 的研发团队中实施时,修复了上千个错误,并将生产环境中的段错误率降低了 30%。此外,C++26 的标准库也进行了全面强化。
核心特性的争议、巨头的实践反馈、创始人的明确反对——C++26 的到来似乎预示着这门经典语言又将进入一个充满讨论与变革的新阶段。关于 C++ 未来方向的思考与讨论,也欢迎你在 云栈社区 的开发者广场 与其他开发者一起交流探讨。
|