C++26 正式收官:这门“老语言”终于不再只靠程序员小心翼翼地活着

开发工具 2026年3月30日
C++26 正式收官:这门“老语言”终于不再只靠程序员小心翼翼地活着
C++26 的技术工作已经完成,这可能是自 C++11 以来最重要的一次版本更新。比起新增几个炫目的语法糖,这一版真正改变行业预期的,是反射、契约和一整套面向内存安全的改进——它在尽量不牺牲性能的前提下,开始认真修补 C++ 长期背负的“危险但高效”形象。

C++26 终于定稿,标准委员会给这门老语言换了一副更像 2026 年的面孔

在英国伦敦克罗伊登举行的 ISO C++ 标准会议上,C++26 的技术工作正式结束。按流程说,它已经完成了核心内容,接下来进入国际审批和最终编辑阶段。对普通开发者来说,这句话可以翻译成一句更直接的话:下一代 C++ 标准,基本板上钉钉了。

这次会议有大约 210 位与会者,130 人线下、80 人线上,来自 24 个国家。光看数字也许平平无奇,但如果你了解标准制定的节奏,就会知道这其实像一场漫长而枯燥的“语言修宪”终于投票落槌。C++ 的标准从来不是哪家公司一拍脑门说了算,也不是某位明星程序员在社交媒体上发个帖就能定方向。它慢,争议多,经常让人抓狂,但也正因为这样,它一旦做成,往往意味着整个产业链——编译器、标准库、操作系统、浏览器、数据库、游戏引擎、金融基础设施——都要跟着转向。

Herb Sutter 说这是“自 C++11 以来最有吸引力的一次发布”,这话不算夸张。C++11 当年带来了 lambda、auto、智能指针、移动语义、多线程库,几乎重塑了现代 C++ 的日常体验。过去几版标准当然也有大功能,比如 concepts、coroutines、modules,但它们并没有像 C++11 那样“人人每天都能摸到”。C++26 不一样,这次瞄准的是更底层、也更痛的地方:语言表达能力,以及内存安全。

这次最值得聊的,不是新功能有多炫,而是 C++ 开始认真面对“危险”

C++ 的声誉一直很复杂。它是高性能系统的王牌语言,游戏引擎、数据库、浏览器内核、量化交易、嵌入式系统、操作系统组件,到处都少不了它。可另一面,它也长期和越界、悬空指针、未定义行为、内存破坏绑在一起。安全研究员和大型软件公司这些年越来越不客气地指出:很多严重漏洞,本质上就是内存不安全语言留下的坑。

所以,C++26 最重要的现实意义,不是“更现代”,而是“更不容易把自己炸掉”。这次版本里有两项非常关键的安全改动。第一,读取未初始化局部变量导致未定义行为,这一大类历史问题被正面处理了。第二,标准库开始引入更强的加固机制,给 vectorspanstringstring_view 等常用类型上的边界相关操作提供跨平台安全保障。

这不是纸面上的理想主义。Herb Sutter 在会后总结中提到,Google 和 Apple 已经在超大规模生产环境里实践了类似机制。尤其是 Google 的数据很扎眼:在数亿行 C++ 代码上,这套加固措施平均只带来约 0.3% 的性能开销,却已经修掉上千个 bug,并把整体段错误率压低了 30%。说得再直白一点,过去 C++ 世界里常见的那种“为了性能,安全只能靠纪律和经验”叙事,正在被现实打脸。事实证明,很多安全防护没那么贵,贵的是几十年来大家形成的心理定势。

这也是为什么我觉得 C++26 的影响会超出语言圈。今天从美国政府到大型科技公司,再到浏览器和移动平台,几乎都在谈 memory safety。Rust 之所以一路高歌猛进,并不只是因为它语法新,而是因为它正好踩中了行业对安全的时代焦虑。C++26 没有变成 Rust,也不可能变成 Rust,但它开始主动回应这场焦虑,这本身就是巨大变化。

反射来了:C++ 把“看见自己”这件事,终于做成了标准能力

如果说安全改进解决的是“别再那么容易出事”,那反射解决的就是“能不能写得更聪明、更省力”。C++26 最受语言设计圈兴奋的一项能力,就是编译期反射。

这东西听起来学术,实际上非常接地气。很多 C++ 程序员今天要做序列化、ORM、RPC、自动生成绑定代码、调试工具、元编程框架时,都会绕进一大堆模板黑魔法、宏、脚本生成器,或者依赖编译器扩展。反射的意义在于,语言终于能更正式地“描述自己”,让程序在编译期读取类型和结构信息,再生成所需代码。Herb Sutter 把它称作“定义未来十年的火箭引擎”,这比喻挺中二,但不离谱。

为什么这件事重要?因为 C++ 过去最强的抽象能力,一直建立在模板之上。模板很强,但也很难爱,错误信息能把人看出工伤。反射一旦成熟,会明显降低很多库设计的复杂度。你可以把它理解成:C++ 终于不必总靠“拧巴但高效”的技巧来换抽象能力了。

当然,反射的真正威力不会在标准发布当天就全面释放。它更像是基础设施。短期内,普通业务开发者未必立刻感到天翻地覆;但库作者、框架作者、工具链作者会先兴奋起来。接下来几年,围绕反射构建的新一代 C++ 开发工具和库生态,很可能才是它真正改变行业的地方。

契约和异步模型都进来了,但争议也没消失

C++26 另一个引人注目的内容是契约(contracts)。简单说,就是语言级的前置条件、后置条件和断言。和 C 时代那个粗糙的 assert 宏相比,这套东西显然更现代,也更适合大型工程,尤其是在功能安全、关键系统、复杂接口约束方面。

但契约并不是一路掌声通过的。标准委员会内部一直有人有持续而严肃的技术异议,最终投票也不是全票通过。这反而让我觉得它更可信——因为这说明大家不是在“为了发版而发版”,而是真的把风险和代价翻来覆去掰扯过。最后的结果是:委员会认为它仍然值得留在 C++26。

这背后其实是 C++ 标准制定的一种典型气质:宁可争到最后一刻,也不轻易放弃能改变工程实践的特性。契约未来会不会在不同编译器和工具链中呈现出复杂的边角问题?大概率会。开发者会不会抱怨它的学习成本和行为语义?也会。但如果没有这一步,C++ 在“可验证的软件工程”这条线上就始终差一口气。

与此同时,std::execution 也正式成为 C++26 的核心成果之一。它常被称作 Sender/Receiver,是新一代异步并发模型。这个特性很强,但老实说,距离“普及”还有不小距离。它不像 autorange-for 那样一眼就会用,文档、教程、辅助库目前都还不够友好。Herb Sutter 自己也承认,这东西短期内更像专家工具,而不是大众武器。

不过它有一个非常重要的长线价值:它试图用结构化并发的方式减少数据竞争,把并发程序从“能跑就算赢”拉回到更可控的工程模型里。这个方向是对的。过去十几年,C++ 并发编程的难,不只在 API,而在心智负担。std::execution 解决不了所有问题,但它至少在标准层面给出了一套更系统的答案。

接下来轮到 C++29:更安全,会是这门语言未来几年的主旋律

如果说 C++26 是一次明确的转向,那 C++29 很可能会把这个转向继续推到底。标准委员会已经确定了下一轮三年周期,并把更多内存安全工作列为重点。会议期间,多场高参与度讨论都围绕类型安全、内存安全和 profiles 展开。

这里面有个信号特别清晰:C++ 社区不再满足于“提供工具,让高手自己小心使用”。它开始思考,能不能通过 profile、子集、约束和默认行为,把“写出安全代码”这件事变得更像默认选项,而不是少数高手的手艺活。Bjarne Stroustrup 提出的类型安全 profile,以及 Apple 在 WebKit 上对 400 多万行代码进行约束和加固的实践报告,都在强化这个方向。按照 Apple 的说法,这些策略已经能封堵多类漏洞,甚至如果当年就采用,很多历史漏洞本可以被提前拦住。

这很像 C++ 正在和自己年轻时的浪漫做切割。曾经它以“给程序员全部控制权”为荣,默认你是成熟、谨慎、懂硬件、懂 ABI、懂生命周期的超级工程师。可今天的软件规模、供应链复杂度和攻击面,已经让这种浪漫越来越昂贵。语言如果还坚持“我只负责给你刀,不负责你别切到手”,那它就会在现代安全标准面前越来越被动。

但这里也埋着一个值得继续观察的问题:C++ 能不能在补安全短板的同时,不把自己补成另一个臃肿、沉重、实现困难的庞然大物?毕竟标准加得越多,编译器负担越大,学习门槛也可能继续抬升。C++ 这些年最大的批评之一,从来不只是危险,还有复杂。C++26 在正确的方向上迈了一大步,可它也必须警惕:别把“更安全”变成“更难懂”。

从产业角度看,我同意 Herb Sutter 的一个判断:C++26 的采用速度,可能会比 C++17、C++20、C++23 快。原因不复杂,用户需求足够强烈,编译器实现也推进得相对顺利。GCC 和 Clang 在标准制定期间就已经实现了相当大比例的特性,而反射、契约等关键内容也在加速落地。对于那些一直迟迟没开 C++20 开关的大公司来说,C++26 反而可能是更有说服力的升级理由——因为它不是“开发者想要的新玩具”,而是安全团队、平台团队、基础设施团队都会盯上的新底座。

Summary: 我的判断是,C++26 会成为这门语言近十年来最具分水岭意义的版本。它未必能立刻扭转“C++ 难学又危险”的公众印象,但它至少开始用标准层面的行动回应现实世界对安全和工程可控性的要求。接下来三到五年,真正值得看的不是 C++26 能不能发布,而是大型编译器、标准库和头部公司能否把这些能力做成“默认可用、成本可控”的日常工具;如果做到了,C++ 不会被时代淘汰,反而可能迎来一次相当硬核的复兴。
C++26C++ISO C++ 标准会议编程语言标准内存安全反射契约Herb SutterC++11标准委员会