前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >快报!c++26 最新进展!Hagenberg会议!

快报!c++26 最新进展!Hagenberg会议!

作者头像
王很水
发布2025-02-18 21:04:46
发布2025-02-18 21:04:46
1630
举报

本文来自前线记者Mick

Hagenberg (2025-02)总结 这次会议是C++26周期第六次会议,也是C++26 Feature Freeze;到这一步,所有没有进入Stage 3 (wording)的提案都只能推迟到C++29了,因此我们也确定了C++26所可能拥有的特性的最大范围。

这次会议同样是整个周期最重要的会议之一,我们迎来了C++20之后第一个T0级语言特性的通过,迎来了多个历经十年长跑的提案的修成正果,也迎来了C++在安全问题上迈出的第一大步。作为一个不在主场进行的会议,本次会议的参会人数只有200人(比上次少20人左右),但是依然迎来了大量重要的进展。

先来看看这次会议通过进入C++26的提案。语言方面,最重要的提案无疑是P2900 Contracts,这一重量级特性是对C assert()宏的正式承认和发展,加入了新的contract_assert宏和pre/post指示来明确实现函数的前置/后置条件。与assert宏依赖的NDEBUG不同,这些新的Contracts指示将会通过编译选项(-fcontract-semantic=...)指示,并提供了更加细致的四种不同语义(ignore,observe,quick_enforce,enforce)来满足各种场景的需求。Contracts是一个非常大的话题,在这里也没法用几句话囊括它的一切,但作为C++最重要的安全特性之一后面应该会有大量的教程来讲解这个特性

另一个重要的通过的语言特性是P2786 trivially relocatable。平凡迁移指的是那些“移动+析构=memcpy”的类型,而满足这个条件的类型出乎意料地多(例如三家里有两家的vector和string都能平凡迁移)有了语言层面的探测平凡迁移类型的手段之后,vector::resize之类的函数就可以将元素数组整体memcpy过去而不是一个个移动了。遗憾的是,在EWG的长期争吵之后,P2786最终选择了trivially_relocatable_if_eligible和replaceable_if_eligible这两个超级长的关键字名字作为标记一个类型可以平凡迁移的手段,并且为了安全这些关键字只有当所有成员都能平凡迁移的情况下才有效,极大限制了它们的可用性。

除此之外,这次会议还通过了P1976 #embed。这是一个C23的新预处理宏,允许将任意文件作为逗号分隔的列表引入程序。这是对于传统的#include "some_data.txt"的更高级解决方案,速度更快,也没有撞到字符串极限的可能性。它的功能也更强,可以通过#embed "something" limit(5)来限制最大可引入的元素数。

这次会议还通过了P3475(废除没人能懂的memory_order::consume),P2841(允许template<template<typename> concept C>和template<template<typename> bool B>等构造) 标准库方面,这次会议通过的最重要特性无疑是P3471 Standard Library Hardening,在标准中规定了“强化实现”的概念。在强化实现中,标准库中的各个operator[]和其他常见函数将会使用Contracts强制检查参数没有出界,从而能够有效避免一些最常见的越界UB的发生。和P2900结合,这两个提案是对近期爆发的对C++安全性的批评的有力回应。在P3100/P3599得到实现后,在语言和库方面我们终于对于常见UB有了有效的解决方案。

另一个重要提案是P0447 std::hive。这是一个悲情的提案,初版提出于2016年,经过9年争吵,整整29个revision,以及改名(colony -> hive),以及在2023年险些被直接拒绝,最终还是在这次会议修成正果。这个新的标准顺序容器是一个很有意思的容器,利用特殊的跳表+链状数组结构实现了所有元素的绝对迭代器稳定性(只要不被删除就永远有效)+均摊O(1)的插入/删除/迭代这样看似不可能达成的复杂度。这一特性使得它非常适合在各类游戏项目中储存entity;这些游戏元素很多时候会被不断插入和删除,但是既有的元素的位置不能变。

第三组重要的通过提案是P3372 constexpr容器和P3378 constexpr异常类型。在上次会议允许了编译期抛异常之后,这次将大多数标准异常类型(比如out_of_range,invalid_argument)完成了constexpr化,从而让编译期抛出这些异常成为可能。P3372也让list map deque等容器在编译期的使用成为可能,不过遗憾的是非透明编译期内存分配仍然没有任何解决的希望,从而这些容器的constexpr使用总是让人觉得有些别扭。

除此之外,这次会议还通过了多个SIMD bugfix提案,P3137 views::to_input,P2846 ranges::reserve_hint等Ranges增强;另外P3019 indirect and polymorphic在上次通过后发现了一些问题,这次会议再次通过了一下。 在各特性的进展方面,这次会议是Stage 2 -> 3的deadline,现在还没forward的就都被推迟到29周期去了。

EWG方面,这次会议P2996 静态反射的review已经接近尾声,基本确定将会在下次会议进入Plenary。这次会议通过了几个针对P2996的bugfix和扩展,包括P3547 access_context来限制反射体的获取可能性,以及P3096函数参数的反射。除此之外,BS和HS提出的重量级安全特性Profiles(其实就是写[[profiles::enforce(xxx)]]然后禁掉一些不安全特性,reinterpret_cast之类的)在讨论了一天半之后最终决定不进入C++26,而是改为发布一个白皮书(轻量级TS)来更快推进。(被忽略好几年的TM TS可能也会转换成白皮书)

其他大特性方面,模式匹配最终小比分落败,没能进入C++26,但是在最后一天EWG保住了P1306 Expansion Statement这个重要的反射的补充特性,也算保住了底线吧。接下来CWG将会有比较艰巨的任务,完成反射这个巨大提案的review的同时还被塞了30+篇小提案,最后可能不得不要掉出去一堆了。 LEWG方面,这次会议通过了大量S&R的附属提案,包括P3149 async_scope和P3296 let_async_scope这两个重量级的Structured Concurrency提案(遗憾的是std::task/lazy依然没有太大进展)和一个标准化的系统调度器(P2079)。除此之外,几个著名的提案包括P2988 std::optional<T&>,P3179 Ranges化的多线程算法,P2019线程名称与与栈大小,以及P0260多线程队列也得到了forward的机会,从而有机会进入C++26。接下来LWG的任务较为轻松,只要把那几个S&R的提案搞定其实就差不多了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CPP每周推送 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档