C++23已完成,C++26来了( 二 )


您可以找到的所有一元接口的完整描述 std::预期 在 P2505R5 。
static_assert(假)等
除了上面概述的重大变化外,还进行了大量的修订,以消除小的粗糙边缘并改进日常开发 。例如,的格式化程序 标准::线程::ID 以及 标准::堆栈跟踪 (英文) 小行星2693 ),以便它们可以与 标准::打印 以及 标准::格式 。标准::开始寿命为 还接收了额外的编译时签入 小行星2679。值得注意的是,静态断言(假)在模板函数中,不再在不实例化函数的情况下触发,这意味着只有在传递错误的数据类型时,才会编译如下代码并发出诊断:
templateint foo() {if constexpr (std::is_same_v) {return 42;} else if constexpr (std::is_same_v) {return 24;} else {static_assert(false, "T should be an int or a float");
除了前面提到的变化之外,C ++23中的范围还做了无数的改进 。其中最重要的是包括 标准::视图::枚举 在 小行星2164:
#includeconstexpr std::string_view days[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun",for(const auto & [index, value]: std::views::enumerate(days)) {print("{} {} n", index, value);C++26语言聚合的std::get和std::tuple_size
有一个令人兴奋的新想法可以改进C++,我们已经在Yandex Go和用户服务器框架中积极使用了这个想法,多亏了Boost.PFR,任何想要使用它的人都可以使用它 。
如果您正在编写一个通用模板库,那么您可能需要使用std::tuple和std::pair 。但是,这些类型存在一些问题 。首先,它们使代码难以阅读和理解,因为字段没有明确的名称,并且很难辨别std::get<0>(tuple)之类的内容的含义 。此外,库的用户可能不想直接使用这些类型,而是在调用方法之前创建这些类型的对象,这可能会由于数据复制而导致效率低下 。其次,std::tuple和std::pair不会“传播”它们存储的类型的平凡性 。因此,当从函数传递和返回std::tuple和std::pair时,编译器可能生成效率较低的代码 。
然而,聚集体--具有公共字段且没有特殊功能的结构--没有上述缺点 。
背后的想法 P2141R0 是允许在泛型代码中使用聚合 标准::获取 以及 标准::元组大小和他们一起工作 。这将使用户能够将他们的结构直接传递到您的泛型库,而无需进行不必要的复制 。
这个想法得到了委员会的好评,我们将继续测试和解决任何潜在的粗糙边缘 。
包埋数量
目前,正在积极开发一个新的C语言标准(无类的,没有++),它包括许多在C++中早已存在的有用特性(例如nullptr、auto、constexpr、static_assert、thread_local、[[noreturn]]),以及C++的全新特性 。好消息是,一些新特性将从新的C标准移植到C++26 。
#embed就是其中一个新特性--一个预处理器指令,用于在编译时将文件内容替换为数组:
const std::byte icon_display_data[] = {#embed "art.png"
一些次要的细节需要解决 。有关该理念的完整描述,请参见 小行星1967 。
从异常获取std::stacktrace
WG21的想法是 小行星2370遭遇了意想不到的挫折 。
从异常获取堆栈跟踪的能力在大多数编程语言中都存在 。此功能非常有用,允许进行信息量更大、更易于理解的诊断,而不是像“捕获异常”这样信息量更小的错误消息:地图::位置:
Caught exception: map::at, trace:0# get_data_from_config(std::string_view) at /home/axolm/basic.cpp:6001# bar(std::string_view) at /home/axolm/basic.cpp:62# main at /home/axolm/basic.cpp:17
当在持续集成(CI)环境中使用时,这个特性非常有用 。它允许您快速识别测试中的问题,并避免在本地重现问题的麻烦,这可能并不总是可能的 。
不幸的是,国际委员会并没有完全接受这个想法 。我们将调查这些担忧,并努力完善这个想法,希望得到更多的支持 。
栈式协程
经过多年的努力,C++标准终于接近于在C++26中添加对栈式协程的基本支持(参见P0876) 。有必要深入研究一下堆栈与无堆栈协程 。
无栈协程需要编译器的支持,并且不能作为库单独实现 。另一方面,堆栈式协程可以自己实现--例如,使用Boost.Context 。
前者提供了更有效的内存分配,潜在的更好的编译器优化,以及快速销毁它们的能力 。它们也已经在C++20中可用 。
后者更容易集成到现有的项目中,因为它们不需要像无栈协程那样完全重写新的习惯用法 。事实上,它们完全向用户隐藏了实现细节,使用户能够编写简单的异步线性代码 。


推荐阅读