大叔自由人
深色背景编辑插画:右侧一张轻微倾斜的米色标准文件盖上红色圆形「未通过 DISAPPROVED」印章,文件下方两枚深色标签写着「导火索:Contracts 契约」与「六条出路 · 均未成决议」;左侧金色大字「114 : 12」,其下两行白色大字「委员会赢了,全世界说不。」,副标题「史上首次:最终标准草案被 ISO 否决」,左下角胶囊徽章写着「11.16 巴西全会:开始作答」。
技术分享

委员会里 114 比 12 大胜,全世界投票说不行:C++26 史上首次被否决——当一门 40 多岁语言的创造者与所有者吵翻了

10 月 23 日,为期 12 周的国际投票结束,C++26 的最终国际标准草案(DIS)被正式否决。据标准委员会委员 Andreas Fertig 查证,在能查到的 ISO 编程语言标准记录里,除了 2006 年未获通过的 C++/CLI 草案(那个项目最终被终止)之外,几乎找不到第二例。C++ 四十多年的标准化历史,第一次在终点线前被拦下。

而最有戏剧性的部分是:把它拦下的争议,集中在一项叫 Contracts(契约)的新特性上;领衔反对的,恰恰是 C++ 之父 Bjarne Stroustrup。

契约是什么,为什么值得吵成这样

Contracts 想做的事并不复杂:让函数接口的前置条件、后置条件和断言成为语言的一部分。比如在函数签名里写一句「调用者必须保证除数不为零」,而不是散落在代码各处的临时断言。支持者认为这给调试、运行时检查和代码质量提供了统一机制——这套设计(提案 P2900)社区已经打磨多年。

反对者领头的正是 Bjarne。2026 年 8 月,Bjarne 等人提交文档《P2900 契约的根本缺陷》,质疑集中在三条:其一,这是会深刻影响语言语义的基础设施,在没有充分实现和大规模实践验证的情况下不该进标准;其二,ignore、observe、enforce 三种检查模式在不同编译配置下可能表现不同,跨翻译单元的一致性存疑;其三,保证机制、虚函数语义等关键问题没有解决,不能甩给未来版本。

这背后是两种工程哲学:一方认为先把多年讨论的实用方案纳入标准、后续迭代完善;另一方认为基础语言设施一旦进入标准就会影响未来几十年的代码,必须在发布前验证充分。两种立场都有道理,这正是它难解的原因。

最值得看的一道裂缝:委员会共识不等于国际认可

整个事件里最有信息量的,是这个对照。2026 年 3 月,WG21 在英国 Croydon 的会议上完成 C++26 技术工作,就是否保留契约做过一次全员表决:114 票赞成、12 票反对、3 票弃权——压倒性多数,契约留下,草案提交国际投票。七个月后,ISO 国家成员体的投票结果却是:Disapproved。

ISO 的规则有两道门槛:至少三分之二的参与投票 P 成员国赞成,且反对票不超过全部投票成员的四分之一。C++26 栽在了这里。需要说明:ISO 并未公布各国投票明细,网传的具体票数属于参与者披露口径,不是官方统计。

这道裂缝的名字叫:**WG21 的技术共识,和 ISO 的国际认可,是两道不同的门。**第一道门里 114 比 12 的大胜,到第二道门不作数。这像极了每一个做过政企项目的人都见过的场景——公司内部评审全票通过,到甲方与监管那里被打回:通过标准的人,和使用标准的人,从来不是同一批人。

投票失败后,委员会重要人物 Herb Sutter 发文,标题本身就是问题:《当一门语言的创造者与它的所有者发生严重分歧》。Bjarne 造了这门语言,但 C++ 不属于他;WG21 管技术演进,ISO 管最终批准,编译器厂商和全球开发者构成真实生态。他梳理了六条出路:并入 C++29 重来、移除契约重新投票、原样重投、有限修改(比如虚函数语义)再投、走国家标准体系另发、乃至更换标准化组织路线(归纳自论文与社区讨论,均非委员会决议)。下一次 WG21 全会 11 月 16 日至 21 日在巴西举行,这道题必须开始作答。

一次否决的解剖

慢,有时候是机制在起作用

这件事最反直觉的判断是:它不是 C++ 的危机,而是机制的证明。

把它放进当下的时间轴里看更有意思。上周刚写过造 AI 的人先被 AI 闲置——那边是模型周更、灰度放量、随时回滚,快得让人焦虑;这周 C++ 给出另一个极端:一个特性讨论十几年,一次投票不通过就整个标准打回重来,慢得让人安心。模型发错了可以下线,标准发布出去就是几十年的承诺——写进教科书、写进编译器、写进数以亿行计的存量代码。带着根本分歧发布,撤回成本以十年计。

Hacker News 的讨论里还有一个清醒的提醒:标准不等于语言。开发者实际使用的 C++,由 GCC、Clang、MSVC 的实现决定,这次否决不会让编译器明天就变;但反过来,没有统一标准,编译器之间的分裂只会更大。Reflection、std::execution 这些已经就绪的特性被连坐推迟,确实可惜——但对一门还要服役几十年的语言,这可能是值得付的学费。

给做长期维护系统的团队一句实操:编译器版本要锁,新语言特性要等——特性进入标准只是开始,编译器全量实现、生态工具跟上、坑被别人先踩完,才轮到生产环境。我们给政企单位做长期维护的系统时一直守这条纪律,这次算是全行业看到它的必要性。

读票须知

其一,ISO 未公布各国投票明细,具体票数是参与者披露口径;其二,六条出路是论文与社区讨论的归纳,没有一条是 WG21 已通过的决议;其三,这次否决针对整个 C++26 草案而非仅契约,Reflection 等特性是被连累而不是被否决;其四,DIS 被否不等于 C++26 死亡——重新提交、退回委员会草案、发布技术规范、终止项目,ISO 流程里都还有选项。方向不掺水:把争议解决在发布之前,比按时发布一个带伤的标准更重要——对语言如此,对系统亦然。


参考来源