C++26 草案最终确定,包含静态反射、契约和发送者/接收者类型
本月初,C++ 的下一个主要版本迎来了一个重要的里程碑:ISO C++ 委员会冻结了即将纳入 C++26 的功能集。值得注意的新增功能包括编译时反射、契约、异步执行等等。
静态反射支持编译时对类型和行为进行自省,旨在扩展 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 在其最新的 Trip Report 中如此描述该功能:
即使我们今天拥有第一个部分反射能力,我们也已经能够反射 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++ 标准的进展。