
本月早些时候,ISO C++ 委员会正式冻结了 C++26 的功能集,这标志着 C++ 的下一个主要版本迎来了一个重要里程碑。其中,编译时反射、契约、异步执行等众多备受瞩目的新特性赫然在列。
静态反射 (Static reflection) 支持在编译期对类型和行为进行自省,其目标是扩展 C++ 的元编程能力。在基础层面,反射允许开发者编写如下代码,轻松将枚举 (enum) 转换为字符串:
使用反射的表层语法非常简洁,这与现代 C++ 的设计哲学保持了一致。然而, 上述功能的底层实现却要复杂得多。尽管如此,我们依然可以从中一窥反射即将解锁的强大能力:
反射将以一种早期形态首次亮相于 C++,并有望在未来的版本中不断演进。即便如此,它已然足够强大,足以支持一些高级用例,例如为 JavaScript 和 Python 等其他语言生成绑定。Herb Sutter 在其最新的 Trip Report 中如此描述该特性:
即便只是利用我们目前拥有的这部分初始反射能力,我们就已经可以对 C++ 类型进行反射,并利用这些信息加上普通的 std::cout,从而生成任意额外的 C++ 源代码,然后将这些新生成的代码在程序构建过程中一同编译并链接进去。
未来,利用反射,我们甚至有望通过“令牌注入”(token injection)的方式,在同一个源文件中直接生成 C++ 代码。
在最近的 ISO C++ 委员会会议上,被接纳进标准的新特性还包括:用于 Ranges 库的并行算法;旨在异步上下文中通过 RAII(资源分配即初始化)风格编程来进行资源管理的异步作用域 (async scopes);以及能为线程池提供高级执行上下文的并行调度器 (parallel scheduler)。
此前会议中已接纳的一些主要特性包括契约 (contracts)、异步执行 (asynchronous execution) 以及众多其他功能,例如:通过包索引 (pack indexing) 增强模板元编程、用于包含二进制资源的 #embed 指令、边界检查迭代器和空指针验证、SIMD 并行等等。
契约 (Contracts) 旨在通过 [[pre:]]、[[post:]] 和 contract_assert 来支持“契约式设计”。该特性原计划在 C++20 中引入,但最终从最终草案中被移除,如今它终于正式进入标准。
std::execution 提供了一套在通用执行资源上管理异步执行的机制。其核心概念是发送者 (sender) 和接收者 (receiver):发送者代表一个异步工作单元,它将其结果发送给接收者。该框架还由与异步操作相关联的状态 (state) 和一个轻量级调度器 (scheduler) 等概念共同构成。
C++26 的相关工作仍在继续,但正如 Sutter 所强调的,其完成进度比许多人预期的要快得多,目前 GCC 和 Clang 已经支持了约三分之二的已采纳语言特性。InfoQ 将持续关注并报道下一代 C++ 标准的演进过程。
原文链接:https://www.infoq.com/news/2025/06/cpp-26-feature-complete/
评论