C++26 草案最终定稿,包含静态反射、契约和发送方/接收方类型

本月早些时候,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++标准的进展情况。

阅读 497
0 条评论