内容提要
2026年10月,C++26最终国际标准草案(DIS)投票未通过,为C++史上首次。核心争议是新增的Contracts特性:C++之父Stroustrup等认为其设计不成熟,反对仓促纳入标准,而WG21委员会此前以114:12投票保留该特性。Herb Sutter撰文探讨语言创造者与标准组织的分歧,提出放弃C++26并入C++29、移除Contracts重投等六条路径。事件凸显委员会共识与ISO国际投票间的制度张力,也影响Reflection等其他特性。
延伸解读
制度张力:委员会共识不等于国际标准认可
文章揭示了一个关键制度事实:WG21内部以114:12的投票结果决定保留Contracts,但ISO国家成员机构投票却否决了整个C++26草案。这说明技术委员会形成的多数共识,并不自动转化为国际标准层面的认可。ISO投票规则要求至少三分之二P成员国赞成且反对票不超过四分之一,反对者因此获得了足以阻止标准通过的制度杠杆。这种张力并非技术分歧本身,而是决策程序与批准程序之间的错位。
争议本质:两种工程哲学对风险判断的分歧
Contracts争议背后是两种工程哲学的碰撞。一方主张先将经过多年讨论的实用方案纳入标准,再通过后续迭代完善;另一方认为Contracts作为影响语言语义的基础设施,一旦进入标准就可能影响未来几十年的代码,必须在发布前充分验证。反对者具体指出检查模式(ignore、observe、enforce)带来的语义复杂性、虚函数相关语义未解决等问题。这不是简单的喜好之争,而是对语言长期演进风险的不同判断。
影响范围:被否决的是整个C++26草案
文章特别提醒,这次投票针对的是整个C++26草案,而非仅Contracts一项特性。因此Reflection、std::execution、标准库强化等已经进入C++26的其他特性,也会因投票失败而受到影响。这意味着即使争议核心是Contracts,其他已完成的工作同样面临推迟或重新走流程的风险。对开发者而言,关注点不应只停留在Contracts的去留,而应看到整个标准发布节奏可能被拖慢。
后续路径:六种方案均未成为正式决议
Herb Sutter归纳了六条可能路径:放弃C++26并入C++29、移除Contracts重投、保留设计争取重投、有限修改后重投、探索国家标准体系、调整标准化组织路径。文章明确说明,这些路径是对文章及社区讨论的归纳,并不意味着它们已成为WG21正式通过的决议。下一次WG21全体会议计划于2026年11月16日至21日在巴西举行,如何处理国际投票意见并重建共识将是重要议题。
Q&A
C++26 的 DIS 投票为什么没通过?
2026 年 10 月 23 日,C++26 的最终国际标准草案(DIS)投票未通过,这是 C++ 历史上首次出现这种情况。核心原因是新增的 Contracts(契约)特性引发争议,反对者认为其设计不成熟,不应仓促纳入标准。
Contracts 特性具体是做什么的?为什么会有争议?
Contracts 允许程序员在函数接口层面表达前置条件、后置条件及断言,例如用 pre(b != 0) 声明除数非零。争议在于:反对者认为该特性设计不成熟,不同检查模式(ignore、observe、enforce)会带来语义复杂性,且虚函数相关语义等关键问题尚未解决,不应仓促进入标准。
C++ 之父 Stroustrup 对 Contracts 是什么态度?
Stroustrup 站在反对阵营前列,2026 年 8 月与其他人提交了提案 P4334R0,指出当前 Contracts 设计存在根本缺陷,认为这项会影响语言语义的基础设施不应在缺乏充分实现和大规模实践验证的情况下匆忙进入标准。
WG21 委员会内部投票通过了 Contracts,为什么 ISO 国际投票还是失败了?
2026 年 3 月 WG21 全体会议以 114 票赞成、12 票反对、3 票弃权决定保留 Contracts 并提交国际投票。但 WG21 内部的技术共识不等于 ISO 国际标准层面的最终认可,最终批准权属于 ISO 标准化程序,反对声音在国际投票阶段获得了足以阻止标准通过的支持。
Herb Sutter 提出了哪些解决 C++26 僵局的路径?
Herb Sutter 在文章 P4454R0 中归纳了六条路径:A. 放弃单独发布 C++26,将工作合并到 C++29;B. 移除 Contracts 后重新提交投票;C. 保留现有设计争取重新投票;D. 对 Contracts 部分争议进行有限修改后再投票;E. 探索通过不同国家的国家标准体系发布;F. 调整标准化组织路径,如探索 ANSI/INCITS 等其他渠道。
这次投票失败对 C++ 生态还有什么其他影响?
投票针对的是整个 C++26 草案,而非仅 Contracts。因此 Reflection、std::execution、标准库强化等已进入 C++26 的其他特性也会受到影响。此外,事件引发了对编程语言治理模式的讨论:个人主导(如 Python 的 BDFL 模式)与委员会治理各有优劣,标准也不等于语言本身,编译器实现和生态同样重要。