您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C++23已完成,C++26来了

时间:2023-02-21 14:46:40  来源:今日头条  作者:xTech

六个月以来,国际C++标准化工作组已经召开了两次会议。

在第一次会议上,委员会集中于完善C++23的特性,其中包括:

 

  • 静态运算符[]
  • 静态常量表达式 在 常数表达式 函数
  • 基于安全范围
  • std ::print与其他控制台输出的交互
  • 一元接口用于 std::预期
  • static_assert(false)和其他功能

 

在第二次会议上,委员会致力于开发C++26的新特性,包括:

 

  • 标准::获取 以及 标准::元组大小 用于骨料
  • 包埋数量
  • 获取 标准::堆栈跟踪从例外
  • 栈式协程
C++23静态运算符[]

 

去年夏天,委员会在C++23中添加了静态运算符(),并使为多个参数定义运算符[]成为可能。下一个合乎逻辑的步骤是给予这些操作符平等的机会,即添加写入静态操作符[]的能力。

enum class Color { red, green, blue };struct kEnumToStringViewBimap {static constexpr std::string_view operator[](Color color) noexcept {switch(color) {case Color::red: return "red";case Color::green: return "green";case Color::blue: return "blue";static constexpr Color operator[](std::string_view color) noexcept {if (color == "red") {return Color::red;} else if (color == "green") {return Color::green;} else if (color == "blue") {return Color::blue;assert(kEnumToStringViewBimap{}["red"] == Color::red);

这段代码真的能有效地将字符串转换为枚举吗?

这可能会让人吃惊,但代码实际上非常高效。编译器开发人员 使用类似的方法,我们在 用户服务器 框架。我们创建了一个名为 实用程序::平凡双向映射具有更方便的界面。

constexpr utils::TrivialBiMap kEnumToStringViewBimap = [](auto selector) {return selector().Case("red", Color::red).Case("green", Color::green).Case("blue", Color::blue);

由于现代优化编译器的特性,实现了高效率(但在编写通用解决方案时必须非常小心)。提案P2589R1描述了所有必要的详细信息。

constexpr函数中的静态constexpr

C ++23扩展了它的功能,增加了 常量表达式至字符/自字符。但是,一些实施者遇到了一个问题。一些标准库包含常量数组,用于快速转换 弦<>数,这些变量在函数中声明为静态变量。不幸的是,这妨碍了它们在 常数表达式功能。这个问题是可以解决的,但解决方法看起来真的很笨拙。

最终,委员会通过允许使用 静态常量表达式 变量在 常数表达式 函数,如中所述 P2647R1。一个小小的,但受欢迎的改进。

基于安全范围

这可能是最令人兴奋的消息出来的最后两次会议!

说到这里,我们先来猜个有趣的谜语:你能找出代码中的错误吗?

class SomeData {public:const std::vector& Get() const { return data_; }private:std::vector data_;SomeData Foo();int mAIn() {for (int v: Foo().Get()) {std::cout << v << ',';

答案就在这里。

基于范围的for循环涉及很多底层进程,因此,这些类型的bug可能并不总是显而易见的。虽然通过消毒剂测试可以有效地发现这些问题,但现代项目通常将其作为标准实践(在Yandex,我们也不例外)。然而,理想的做法是尽可能避免此类错误。

在RG21,我们在四年前首次尝试通过以下方式改善这种情况 D0890R0。遗憾的是,这一进程在讨论阶段停滞不前。

谢天谢地,Nicolai Josuttis掌握了主动权,在C ++23中,类似的代码将不再创建悬空引用。属性右侧创建的所有对象 :在基于范围的for循环中,现在仅在退出循环时才被破坏。

有关更多技术详情,请参阅文件P2718R0。

标准::打印

在C ++23中,有一个小的但值得注意的更新 标准::打印:其输出已被调整为与其它数据输出"同步"。虽然现代操作系统上的标准库不太可能经历任何明显的更改,但更新后的标准现在保证消息将按照它们在源代码中出现的顺序输出到控制台:

printf("first");std::print("second");应为std::的一元接口

C ++23在最后一刻添加了一个相当重要的特性: 包含了一元接口,用于 std::预期 ,类似于已可用于的一元接口标准::可选。

using std::chrono::system_clock;std::expected from_iso_str(std::string_view time);std::expected to_bson(system_clock time);std::expected insert_into_db(formats::bson::Timestamp time);// Somewhere in the Application code...from_iso_str(input_data).and_then(&to_bson).and_then(&insert_into_db)// Throws “Exception” if any of the previous steps resulted in an error.transform_error([](std::string_view error) -> std::string_view {throw Exception(error);

您可以找到的所有一元接口的完整描述 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中可用。

后者更容易集成到现有的项目中,因为它们不需要像无栈协程那样完全重写新的习惯用法。事实上,它们完全向用户隐藏了实现细节,使用户能够编写简单的异步线性代码。

无堆叠

auto data = co_await socket.receive();process(data);co_await socket.send(data);co_return; // requires function to return a special data type

堆叠

auto data = socket.receive();process(data);socket.send(data);

P0876已被纳入核心亚组。经过讨论,决定禁止在执行线程之间迁移此类协程。禁止的主要原因是编译器优化了对TLS的访问并缓存了TLS变量的值:

thread_local int i = 0;++i;foo(); // Stackful coroutines can switch execution threadsassert(i > 0); // The compiler saved the address in a register; we’re working with the TLS of another thread摘要

就这么定了!C++23已经被正式发送到更高的ISO权威机构,并将很快作为一个完整的标准发布。

与此同时,C++26的开发正如火如荼,在执行器、网络化、模式匹配、静态反射等方面都有着令人兴奋的前景。



Tags:C++   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
C++中的外部模板及其在当前编译文件中的实例化
在C++中,模板是一种泛型编程的工具,它允许程序员以一种类型无关的方式编写代码。然而,模板的一个常见问题是它们会导致编译时间增加,特别是在大型项目中,当多个源文件包含相同的...【详细内容】
2024-04-11  Search: C++  点击:(2)  评论:(0)  加入收藏
C++常见避坑指南
C++ 从入门到放弃?本文主要总结了在C++开发或review过程中常见易出错点做了归纳总结,希望借此能增进大家对C++的了解,减少编程出错,提升工作效率,也可以作为C++开发的避坑攻略。...【详细内容】
2024-04-03  Search: C++  点击:(5)  评论:(0)  加入收藏
C++ 之父反驳白宫警告:自诞生第一天起,C++ 的目标就一直是提高安全性
整理 | 郑丽媛上个月,美国白宫国家网络主任办公室(ONCD)在一份主题为《回到基础构件:通往安全软件之路》的 19 页 PDF 报告中,呼吁开发人员停止使用容易出现内存安全漏洞的编程语...【详细内容】
2024-03-25  Search: C++  点击:(4)  评论:(0)  加入收藏
八个 C++ 开源项目,帮助初学者进阶成长
通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。1.ThreadPool一个简单的 C++1...【详细内容】
2024-03-22  Search: C++  点击:(21)  评论:(0)  加入收藏
C++多线程编程:解锁性能与并发的奥秘
今天我们将深入探讨C++中的多线程编程,揭示多线程如何解锁性能潜力,提高程序的并发性能。什么是多线程?在计算机科学中,多线程是指一个进程(程序的执行实例)中的多个线程同时执行...【详细内容】
2024-02-03  Search: C++  点击:(69)  评论:(0)  加入收藏
C++代码优化攻略
今天我们将深入探讨C++性能优化的世界。在当今软件开发的浪潮中,高性能的代码是必不可少的。无论是开发桌面应用、移动应用,还是嵌入式系统,性能都是关键。1. 选择合适的数据结...【详细内容】
2024-01-26  Search: C++  点击:(115)  评论:(0)  加入收藏
C++质数检测器的设计与实现​
质数,作为数学中的一个基本概念,一直以其独特的性质吸引着众多研究者和爱好者。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。在实际应用中,质数检测也扮演着...【详细内容】
2024-01-15  Search: C++  点击:(115)  评论:(0)  加入收藏
指针变量在C/C++中的内存占用
在编程领域,尤其是C和C++这类底层语言中,指针是一个核心概念,它允许程序直接操作内存地址。然而,关于指针本身在内存中占用的空间大小,却常常让初学者感到困惑。本文将深入探讨这...【详细内容】
2024-01-09  Search: C++  点击:(95)  评论:(0)  加入收藏
C++的面向对象编程:深入解析与理解
当我们谈论C++时,面向对象编程(OOP)是一个无法回避的话题。那么,C++的面向对象究竟是什么?为什么它如此重要?本文将从基本概念到实际应用,为您详细解析C++中的面向对象编程。一、面...【详细内容】
2024-01-03  Search: C++  点击:(97)  评论:(0)  加入收藏
有什么好用的C/C++源代码混淆工具?
开始使用ipaguard前言iOS加固保护是直接针对ios ipa二进制文件的保护技术,可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP...【详细内容】
2023-12-29  Search: C++  点击:(119)  评论:(0)  加入收藏
▌简易百科推荐
C++中的外部模板及其在当前编译文件中的实例化
在C++中,模板是一种泛型编程的工具,它允许程序员以一种类型无关的方式编写代码。然而,模板的一个常见问题是它们会导致编译时间增加,特别是在大型项目中,当多个源文件包含相同的...【详细内容】
2024-04-11  鲨鱼编程  微信公众号  Tags:C++   点击:(2)  评论:(0)  加入收藏
C++常见避坑指南
C++ 从入门到放弃?本文主要总结了在C++开发或review过程中常见易出错点做了归纳总结,希望借此能增进大家对C++的了解,减少编程出错,提升工作效率,也可以作为C++开发的避坑攻略。...【详细内容】
2024-04-03  腾讯技术工程    Tags:C++   点击:(5)  评论:(0)  加入收藏
C++ 之父反驳白宫警告:自诞生第一天起,C++ 的目标就一直是提高安全性
整理 | 郑丽媛上个月,美国白宫国家网络主任办公室(ONCD)在一份主题为《回到基础构件:通往安全软件之路》的 19 页 PDF 报告中,呼吁开发人员停止使用容易出现内存安全漏洞的编程语...【详细内容】
2024-03-25    CSDN  Tags:C++   点击:(4)  评论:(0)  加入收藏
八个 C++ 开源项目,帮助初学者进阶成长
通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。1.ThreadPool一个简单的 C++1...【详细内容】
2024-03-22  AI让生活更美好  微信公众号  Tags:C++   点击:(21)  评论:(0)  加入收藏
C# 中15个值得收藏的开源项目推荐
在开源的世界里,C# 编程语言也占有一席之地。这些开源项目涵盖了多个领域,从框架、库到工具,它们为C#开发者提供了丰富的资源和工具,帮助他们更高效地开发、测试和部署应用程序...【详细内容】
2024-03-20  程序员编程日记  微信公众号  Tags:C#   点击:(30)  评论:(0)  加入收藏
C#异步编程:Task.Run vs. async-await,掌握基础与高级用法
概述:C#中的异步编程有两主要方式:Task.Run用于在后台线程执行同步操作,而async-await更适用于清晰表达异步流程。基础用法展示了它们的简单应用,高级用法则演示了它们的结合使...【详细内容】
2024-03-09  架构师老卢  今日头条  Tags:C#   点击:(23)  评论:(0)  加入收藏
C++多线程编程:解锁性能与并发的奥秘
今天我们将深入探讨C++中的多线程编程,揭示多线程如何解锁性能潜力,提高程序的并发性能。什么是多线程?在计算机科学中,多线程是指一个进程(程序的执行实例)中的多个线程同时执行...【详细内容】
2024-02-03     AI让生活更美好  Tags:C++   点击:(69)  评论:(0)  加入收藏
C++代码优化攻略
今天我们将深入探讨C++性能优化的世界。在当今软件开发的浪潮中,高性能的代码是必不可少的。无论是开发桌面应用、移动应用,还是嵌入式系统,性能都是关键。1. 选择合适的数据结...【详细内容】
2024-01-26  AI让生活更美好  微信公众号  Tags:C++   点击:(115)  评论:(0)  加入收藏
C# 线程本地存储为什么线程间值不一样
为什么用 ThreadStatic 标记的字段,只有第一个线程拿到了初始值,其他线程都是默认值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问了,那我试着帮他解答一下,也给后面类...【详细内容】
2024-01-26  一线码农聊技术  微信公众号  Tags:C#   点击:(68)  评论:(0)  加入收藏
C++质数检测器的设计与实现​
质数,作为数学中的一个基本概念,一直以其独特的性质吸引着众多研究者和爱好者。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。在实际应用中,质数检测也扮演着...【详细内容】
2024-01-15  鲨鱼编程  微信公众号  Tags:C++   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条