C++26 标准恐怕要延期了。原本以为只是一场例行公事的国际标准投票,结果却出现了让整个 C++ 社区都没想到的结果。
2026 年 10 月 23 日,C++26 国际标准草案(DIS)正式进入 ISO(国际标准化组织)的投票阶段,由各国国家标准机构参与表决。经过长达 12 周的流程,最终结果出来了:Disapproved(否决)。
更值得注意的是,这次投票失败并非因为整个标准存在普遍性的技术问题,问题集中在一个名为 Contracts(契约) 的特性上。一些参与者认为,这项功能还没有准备好,不应该随 C++26 一起发布。
而在此之前,Contracts 已经经历了多年讨论,在 C++ 标准委员会内部也多次获得多数支持。谁能想到,围绕一个特性的争议,最终会演变成整个 C++26 标准的发布危机?
对此,C++ 标准委员会成员、参与德国投票代表工作的 Andreas Fertig 在 11 月 3 日专门撰文,直言这是一场「巨大的灾难」,并对整个 C++ 社区的处境表示遗憾。

C++26 数十年来首次在 DIS 阶段投票失败
很多人不解:这次投票失败究竟意味着什么?其实 C++ 标准的制定并不是委员会内部讨论通过就能直接发布,还需要走完 ISO 的一系列标准化流程。
其中,DIS(Draft International Standard,国际标准草案)是正式发布国际标准之前的一个重要投票阶段。按照 ISO 相关规则,标准草案需要获得至少 三分之二的赞成票 才能通过这一阶段。
而这一次,C++26 没能迈过这个门槛。
Andreas Fertig 表示,就他目前掌握的信息来看,这是 C++ 历史上第一次出现 DIS 投票失败的情况。他还专门查询了 ISO 系统,发现另一个类似案例是 2006 年的 ISO/IEC DIS 26926,也就是 C++/CLI 语言规范——不过那个项目最终被终止了。
当然,他也强调自己的查询权限可能没法覆盖所有历史记录,因此这一判断仍有一定局限。但无论如何,这次 C++26 投票失败的严重程度,已经足以引起整个 C++ 社区的高度关注。
一个 Contracts 特性,为什么能让整个标准卡住?
这场风波的核心,是 Contracts。
简单来说,Contracts 是一种契约编程机制,旨在让开发者能够在代码里明确表达程序运行时需要满足的条件,比如函数调用前的前置条件、执行后的后置条件,以及程序执行过程中需要维持的不变量。
它的意义在于,让代码不仅能描述「要做什么」,还能明确规定「在什么条件下才能这样做」。
但这功能在 C++ 社区一直争议不断。
Andreas Fertig 回顾说,Contracts 并不是突然冒出在 C++26 里的新提案。早在 2019 年的科隆会议上,这项功能就曾以另一种形式进入过 C++20 的标准草案,结果在同一次会议上又被移除了。
随后,C++ 标准委员会专门成立了研究小组,从 2020 年一直工作到大约 2024 年,对 Contracts 的不同设计及相关问题展开研究。研究小组完成工作后,将提案提交给 Evolution Working Group(EWG,语言演进工作组),经过多轮会议讨论,最终以多数票将 Contracts 纳入 C++26。
到了 2026 年 3 月,C++ 标准委员会 WG21 对包含 Contracts 的 C++26 草案进行投票,同样拿到了相当广泛的支持。
然而,事情在最后一步发生了变化。
当草案进入 ISO 国家标准机构(NB)的 DIS 投票阶段后,反对票数量最终导致其未能达到三分之二的通过门槛。Andreas Fertig 根据国家标准机构提交的意见指出,反对的主要理由是:部分机构认为 Contracts 这项功能目前还没有准备好进入正式标准。
双方各有坚持,标准委员会陷入僵局
事实上,让 Andreas Fertig 感到棘手的,不只是投票失败本身,更是这次事件暴露出来的协作问题。
按照他对过去 C++ 标准制定流程的理解,委员会成员通常会在新信息出现时充分表达意见。如果某项提议经过讨论后仍然没有按照自己的意愿修改,参与者一般会尊重最终决定,接受其他人的不同意见。过去,国家标准机构也只有在出现新信息、发现程序错误或类似问题时,才会投票反对一项标准。
但这次情况不一样了。
支持删除 Contracts 的一方认为,新的材料提供了足够理由,证明这项功能还不适合进入 C++26。对此,Andreas Fertig 并不认同——重新提交一份包含旧有论点的提案,在他看来不能算作真正的新信息。
问题在于,双方都已经在这项功能上投入了大量时间和精力。支持方很难接受,一项经过多年开发、在委员会内部多次通过的功能就这样被放弃;反对方同样投入了不少精力,甚至已经开展了替代方案的实现工作。在 Andreas Fertig 看来,双方都很难轻易让步。
C++26 接下来怎么办?四条路都不轻松
那么,C++26 还有机会挽回吗?
Andreas Fertig 根据 ISO 的标准制定流程,列出了四种可能的处理方式:
- 第一,修改标准草案,发起新一轮 DIS 投票。委员会可以调整现有草案,然后重新进入国际标准投票阶段。
- 第二,将修改后的草案退回委员会阶段(CD)。重新进入委员会草案阶段,继续收集意见、讨论和修改。
- 第三,将修改后的草案作为技术规范(Technical Specification)形式单独发布。暂时不将其作为正式国际标准发布,而是通过技术规范的形式继续推进相关工作。
- 第四,直接取消当前项目。这也是最极端的一种选择。
但无论采用哪种方案,都意味着 C++ 下一代标准的发布时间会受到影响。更重要的是,这四条路都需要在 WG21 内部获得多数支持。
Andreas Fertig 特别指出,如果最终决定取消 C++26,那么按照他的理解,委员会可能需要退回 C++23,并直接推进 C++29。这意味着,原本已经成功纳入 C++26 的功能,也需要重新走提案流程才能进入 C++29。而且每项功能都需要有人继续推动——如果原本的提案作者缺乏时间或动力,一些已经获得认可的功能甚至可能就此被遗漏。
所以,这并不只是简单地把 C++26 推迟几个月,而是可能让整个标准制定工作重新洗牌。
C++ 社区真正面临的,是信任危机
文章最后,Andreas Fertig 表达了自己的强烈不满。
他表示,无论开发者是否喜欢 Contracts,是否认为它很重要,或者是否觉得它存在明显缺陷,这项功能都已经经过多年研究,并且以当前形式多次获得多数支持。而这次投票结果动摇的,是整个 C++ 标准制定体系赖以运转的基础:信任与相互尊重。
在他看来,ISO 标准本身就是多方不断妥协的结果。参与者不可能每次都得到自己想要的结果,有人赢也有人输,但最终应该尊重集体决定。然而这次投票中,部分未能在此前讨论中获得支持的一方,最终选择在 DIS 阶段投下反对票,这让原本建立在协作与信任基础上的标准制定机制受到了冲击。
「达成共识需要信任,而这种信任刚刚遭到了动摇。」Andreas Fertig 写道。
值得注意的是,下一次 C++ 标准委员会会议将于 11 月 16 日举行。届时,如何打破当前僵局将成为首要任务。这场争议也很可能进一步影响 C++29 的开发进度。
不过,对 C++ 社区来说,眼下最需要解决的,或许已经不只是 Contracts 究竟该不该进入标准,而是经历这场风波之后,委员会还能否重新建立起合作所需要的信任。
参考来源:https://andreasfertig.com/blog/2026/11/cpp26-dis-failed-how-does-cpp-survive/