败犬日报 2025-06-21
1. C++26 的所有新特性已经完全确定
完整内容 https://zhuanlan.zhihu.com/p/1920296120623564306。
语言方面,最最重要的提案,也是全周期最重要的语言提案,自然是P2996静态反射。在这次会议之前,C++的反射能力是很弱的,只能通过TMP魔法去艰难地拿到类的一些有限的信息(比如聚合的成员数量等等)。在一次会议中,C++的反射能力通过P2996和它的4篇辅助提案的通过得到了超级史诗级增强。现在,我们可以直接使用^^T得到T(类型或者值)的反射对象(std::meta::info类型的值),然后通过极为丰富的API去查询之前想都不敢想的各类信息,比如类型名称(identifier_of(^^T)),成员数量(members_of(^^T, …).size()),甚至各类以前用type_traits写的东西现在都可以用API像调用函数一样使用了(比如add_const(^^T)就等价于add_const_t)。除此之外,上述members_of API还给了我们探查任意类的成员数量,每个成员的修饰符/类型/…等等等等…。这只是P2996提供的220个函数的一小部分,但已经足以展示它的巨大力量。这种能力让很多之前需要依赖宏的反射操作(比如enum to string,debug printer)成为几十行的简单程序。
标准库方面,通过的提案也毫不逊色。最重磅的是7篇Senders/Receivers补充提案——众所周知,去年通过的S&R框架和C++20 Coroutine一样只提供了最基础的框架内容,而没有提供任何实质性的易用性进步,甚至连个hello world都写不出来。P2079 Parallel Scheduler解决了这一点——为标准提供了第一个标准化的调度器。通过较为宽松的wording给了实现很大的自由度来接入操作系统的调度器,同时避免了直接往标准中加入线程池可能导致的oversubscription问题,并且让P2300的hello world例子终于可以跑通了。除此之外,P3552 std::task则终于补全了Coroutine最基础的库类型之一(另一个是generator,至此终于最重要的两个类型都标准化了),给了一个最最基础的可以使用co_await的类型。task还和S&R框架做了深度融合,真正做到了Senders = Awaitable的承诺。除此之外,P3149 async_scope可谓是S&R基础框架之外最重要的特性,为一直宣传的结构化并发编程打下了坚实的基础,终于不用担心各类生命期问题了。