C++26标准刚刚获得批准,这回有个东西大家吵得挺凶,就是那个叫合约的功能。ISO C++委员会(WG21)在伦敦克罗伊登开了个会,3月28日那天把标准给过了。斯特劳斯特鲁普还在科罗拉多州奥罗拉举行的CppCon 2025上发了个牢骚,说合约这玩意儿“既不最小,也不可行”,斯特劳斯特鲁普是合约的反对派之一。赫布·萨特是合约的支持者,他在3月28日宣布这个消息的时候说,C++26是自C++11以来最受瞩目的版本,里头还把Java或C#那种运行时才工作的反射换成了编译时的反射。按照萨特的说法,这种反射可以让C++代码生成得更高效。他觉得这是C++有史以来最强大的抽象引擎。 萨特还提到,为了给代码加上前置条件和后置条件,合约功能就被塞进了C++26里。以前的工作草案里也有这个东西,但WG21在2019年就因为改动太大给撤掉了。萨特说他们是在尽力搞个最小可行产品计划的巅峰之作。虽说目前虚函数上没法直接用合约,不过他们打算留着未来再完善。 Q&A Q1:C++26的合约功能到底啥样? A:这就是在函数声明里写明输入输出条件,然后在函数里面加点断言语句的方式。本意是为了让代码更安全可靠。 Q2:为啥斯特劳斯特鲁普会反对这个功能? A:他觉得这种设计太复杂了,代码意思会跟着所在位置变来变去。斯特劳斯特鲁普不喜欢这种晦涩的复杂性。 Q3:C++26还搞了啥别的大招? A:除了合约,编译时反射也是重头戏。还有内存安全这块也变强了,比如规定了未初始化读取也算错误行为。还有那个std::execution框架,能支持异步执行。 虽然有反对声,但投票结果还是过了,赞成的有114票反对的12票还有3人弃权。赫布·萨特解释说,为了让代码更安全少出错,ISO C++委员会还是得用这个合约功能。而且谷歌那边试用了新库后发现效果不错,把生产环境的段错误率都给降下来了30%。