本月早些时候,C++的下一个主要版本达到了一个重要里程碑,即ISO C++委员会冻结了将进入 C++26 的特性集。值得注意的新增功能包括编译时反射、契约、异步执行等。
静态反射:[https://wg21.link/p2996]允许对类型和行为进行编译时内省,旨在扩展 C++元编程能力。在基本层面上,反射允许编写类似以下代码将enum
转换为string
:
enum Color { red, green, blue };
static_assert(enum_to_string(Color::red) == "red");
虽然使用反射的用户界面语法很简单,但与现代 C++哲学保持一致,上述功能的实现要复杂得多。它仍能让人一窥反射将解锁的能力:
template <typename E>
requires std::is_enum_v<E>
constexpr std::string enum_to_string(E value) {
template for (constexpr auto e : std::meta::members_of(^E)) {
if (value == [:e:]) {
return std::string(std::meta::name_of(e));
}
}
return "<unnamed>";
}
反射将以早期形式在 C++中首次亮相,并有望在未来版本中发展。即便如此,它已经足够强大,可以实现高级用例,如为 JavaScript 和 Python 等其他语言生成绑定。Herb Sutter 在其最新的旅行报告中这样描述该功能:
即使有了我们今天拥有的第一个部分反射能力,我们也将能够反射 C++类型,并使用该信息加上普通的std::cout
来生成基于该信息的任意额外 C++源代码,并且我们可以在构建它时将其编译并链接到同一个程序中。
在未来,使用反射将可以通过令牌注入在同一源文件中生成 C++代码。
在最新的 ISO C++委员会会议上被接受的其他标准功能包括用于 Ranges 库的并行算法、异步作用域,旨在为异步上下文中的资源管理启用 RAII(资源分配即初始化)风格的编程,以及并行调度器,为线程池提供高级执行上下文。
在之前的委员会会议上被接受的几个主要功能包括契约、异步执行以及此处未涵盖的许多其他功能,如使用包索引增强模板元编程、用于包含二进制资源的#embed
指令、边界检查迭代器和空指针验证、SIMD 并行性等。
契约旨在通过[[pre:]]
、[[post:]]
和contract_assert
支持契约式设计。原本计划在 C++20 中,但最终从最终草案中删除,但现在正在进入标准。
std::execution
提供了在通用执行资源上管理异步执行的机制。其核心概念是发送者和接收者:发送者表示发送其结果到接收者的异步工作单元。该框架由与异步操作相关的状态概念和轻量级调度器完成。
C++26 的工作仍在继续,但正如 Sutter 所强调的,它比许多人预期的更接近完成,GCC 和 Clang 已经支持大约三分之二的采用语言功能。InfoQ 将继续报告下一个 C++标准的进展情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。