历经四十多年演化、支撑全球核心基础设施的 C++ 遭遇了标准化历史上最严重的一次程序危机。在 2026 年 10 月 23 日截止的 ISO 国际标准草案(DIS)投票中,C++26 成为 C++ 历史上、也是 ISO/IEC JTC 1/SC 22 下辖所有编程语言标准中,第一个在 DIS 阶段折戟的草案。

这意味着工业界期待已久的静态反射、并发框架 std::execution、标准库硬化机制与契约(Contracts)全数被卡在未获批准的草案中。阻击这场技术换代的导火索,并不是那些改动庞大的编译器基础设施,而是关于契约机制(Contracts)究竟如何保证安全的技术哲学大决裂。

ISO C++26 DIS 投票审批门槛与实际结果对照 P 成员赞成率(需 ≥ 66.7%) 60.0% 12 票赞成 / 20 票(至少需 14 票) 未达法定门槛:缺 2 票赞成 全体反对率(需 ≤ 25.0%) 40.9% 9 票反对 / 22 票(上限为 5 票) 严重超标:多出 4 票反对

史上首次流产:门槛双双失守

按照 ISO/IEC 导则程序,一份国际标准草案若想通过,必须同时满足两个硬性条件:第一,参与表决的正式成员(P 成员)赞成票比例不得低于三分之二(66.7%);第二,所有投票体中的反对票比例不得超过 25%。

草案因契约争议被全包否决,静态反射等重大特性一同停摆(示意图)
草案因契约争议被全包否决,静态反射等重大特性一同停摆(示意图)

C++26 两条线全未守住。在 20 个参与投票的 P 成员中,赞成票仅有 12 票,赞成率仅为60%,距离及格线还差 2 票。而在全部 22 个投票体中,有 9 个国家直接投出了反对票,反对率高达40.9%,远超 25% 的上限。在 ISO 体系下,触碰其中任意一条红线即可判为不通过,而 C++26 却以双重不达标的悬殊差距滑铁卢。

投下反对票的 9 个国家包括丹麦、芬兰、伊朗、意大利、日本、卢森堡、罗马尼亚、西班牙与瑞典,且每一国都附带了正式的技术抗议意见。法国与爱尔兰选择弃权,但同样递交了审查报告;美国与波兰则保持弃权。负责 C 语言标准的委员会召集人 Robert Seacord 公开表示,在其记忆中 SC22 下辖从没有任何一个语言草案遭遇这种败局。曾经在 WG21 领导小组中任职的 Daveed Vandevoorde 更是直言,以往的 C++ 草案在这一阶段甚至从未收获过哪怕一张反对票。

捆绑进同一份草案的非争议特性,最终成了标准化博弈的陪葬品。

这次表决受挫的致命影响,在于 ISO 的全包表决机制。尽管业界的怨气几乎全冲着契约机制而去,但与契约一同被锁在草案里的,还有筹备多年的静态反射机制以及革新异步并发底层的 std::execution。因为草案未获批准,整个 C++26 的正式交付时间表全线停摆。

契约之争:未定义行为治理的路线决裂

引发 9 国联手否决的真正核心,是重新打包进草案的契约设计案 P2900R14。契约并非新概念,早在 2019 年 C++20 定稿前夕的科隆会议上,委员会就通过 P1823R0 在最后时刻强行剔除了当时的契约方案。如今时隔六年,历史近乎原样重演。

契约机制允许忽略检查的求值语义,引发了未定义行为失防的技术决裂
契约机制允许忽略检查的求值语义,引发了未定义行为失防的技术决裂

争议的焦点在于:在工业界对内存安全极度敏感的当下,契约到底是一个用来写文档的可选检查器,还是一面消除未定义行为(Undefined Behavior, UB)的坚固护栏?

在现行 P2900 草案里,代码允许开发者为函数定义前置条件、后置条件和断言。但草案同时定义了四种求值语义:ignore(忽略)、observe(观察)、enforce(强制检查)以及 quick-enforce。编译器(如 GCC 16)通过编译开关来决定启用哪种模式。库设计者希望契约像编译期的 Concepts 一样,在运行时充当机器可读的接口契约与文档说明;但语言缔造者与系统安全阵营对此深恶痛绝。

C++ 之父 Bjarne Stroustrup 联合 J-Daniel Garcia、Vinnie Falco、John Spicer 与 Ville Voutilainen 共同提交了编号为 P4334R0 的抗议文件,直指契约设计存在根本性缺陷。另一份编号为 P4332R0 的报告更尖锐地指出:允许被关闭或仅被观察的可选检查,根本不配作为消除未定义行为的基础,直接站在了 P3100 演进方向的对立面。

契约(Contracts)设计哲学的深层路线对立 库设计与工具派(P2900 / P4433) 定位:代码级文档与运行时验证 机制:多重求值语义(可开可关) 主张:优先提供表达力,依靠实践持续迭代 安全与系统核心派(P4334 / P4332) 定位:根除未定义行为的强制防御 机制:违背契约必须硬性终止执行 主张:放任可选检查将诱发隐蔽 UB 与安全灾难

反对派的逻辑非常务实:一旦契约求值在生产发布构建中被静默忽略或设置为观察,原本依赖前置条件成立的代码段就可能在违规状态下继续跑下去,导致更诡异的内存崩溃与未定义行为。在外部舆论和监管机构对内存安全群起发难的环境下,C++ 委员会若推出一套在违规时可以不退出的半吊子安全机制,无异于自毁长城。

象牙塔共识与国家级投票的技术断层

这场事故最为反常的地方,在于专家委员会内部的技术表决与国家标准化机构的行政投票发生了戏剧性的脱节。

委员会内部的技术压倒性共识,与国家机构层面的表决机制发生戏剧性脱节
委员会内部的技术压倒性共识,与国家机构层面的表决机制发生戏剧性脱节

在 WG21 委员会内部,支持契约的派系并非弱势。在早期的关键节点上,P2900R14 曾以 100 票赞成、14 票反对(12 票弃权)的悬殊比例过审;在推进到 DIS 的投票中,专家们更是投出了 114 票赞成对 12 票反对(3 票弃权)的压倒性共识。支持派随后在 P4433R0 中明确控诉:反对派在技术委员会内部全面落败后,绕过了数百名专家的集体智慧,转而在各个国家成员体层面进行游说与程序性阻击。

这种脱节暴露了 ISO 既有治理体系在面对现代软件技术演化时的巨大摩擦。国家标准体层面的投票并不完全由身处一线编写代码的工程师决定,甚至极易受到流程机制的偶然性摆布。

以最终投出弃权票的波兰为例,其在波兰标准化委员会 KT 331 内展开表决时,险些因为投票人数达不到法定门槛(Quorum)而彻底废票。由于部分具有投票权的委员早已跳槽离职,联络邮箱频遭退信,导致活跃成员在最后几天不得不在社交平台上四处寻人补票。这种脆弱的人员更迭与程序规则,最终反噬了技术共识本身。

四条岔路与巴西会议的最后拆车

根据 JTC 1 导则 2.6.4(c) 条款,面对被否决的 DIS 草案,标准委员会面前只剩下四条走廊:

草案被否决后只剩四条程序走廊,全会风向迅速倒向切除争议特性的妥协方案
草案被否决后只剩四条程序走廊,全会风向迅速倒向切除争议特性的妥协方案
  1. 分发修改版 DIS 重新投票修正争议点后进行缩短至 8 周的再次表决;
  2. 退回委员会草案(CD)阶段重新收集意见并彻底大改,时间表严重后延;
  3. 降级为技术规范(TS)将争议特性以技术规范单独发布;
  4. 撤销项目直接废弃该版本,由 SC22 全会拍板。
C++26 DIS 未过后的 ISO 程序处理走向 路径一:剔除重投 剥离契约仅留硬化 发起 8 周快速投票 最可能推行方案 路径二:强推复核 维持 P4433R0 路线 不改契约强求过审 再遭否决风险极高 路径三:降级 TS 契约转为技术规范 脱离主干独立发布 变相推迟至 C++29 路径四:退回 CD 草案回炉深度返工 全盘洗牌重集评论 发布节奏推迟数年

死局的解铃地落在了2026年11月16日至21日的巴西布济乌斯(Búzios)全会上。这是投票结果公布后 WG21 委员会各方专家的首次面对面交锋。

目前的风向正在迅速向拆车妥协倾斜。P4238R1 提案作者之一 J. Daniel Garcia 已经公开建议:最现实的短期解决方案就是切除引发重大争议的那一个特性,换取标准其余部分的快速过审。Daveed Vandevoorde 同样倾向于建议从草案中全面剔除契约,只做微调以保留标准库硬化机制。

从工程现实来看,生产环境不必过度惊慌。GCC 16 目前虽然支持 -std=c++26 并在其中提供了实验性的契约支持,而 Clang 在 -std=c++2c 下甚至尚未合并契约实现。编译器的实验性支持不等于工业界的规范承诺。根据以往经验,上一代 C++23 直到 2024 年 10 月 19 日才最终作为 ISO/IEC 14882:2024 正式出版;因此即便本次修改导致最终版本拖延至 2027 年才能走完印制流程,规范名依然大概率保留为 C++26。

  • 风险.若在 11 月巴西全会上无法达成解绑共识,静态反射与并发框架将连带延期,开发者在 2027 年前恐难在正式标准名义下使用这些基础设施。
  • 建议.工业界技术团队在生产环境中应果断暂缓针对 C++26 契约语法的重度绑定与业务重构,继续观望 2027 年 1 月中旬解密的完整国家体意见。