C++ 20新特性
文章平均质量分 79
本专栏将介绍C++ 20中的新特性,帮你精通Concepts、结构化绑定、指定初始化器、std::format、三向比较运算符、Ranges、Lambda表达式、线程与jthread、协程、模块、异步编程等众多知识点。
希望_睿智
中国科学技术大学毕业,专注于音视频领域近二十年,全网访问量近500万,粉丝近10万。在嵌入式开发、运营级平台、音视频编解码、视频图像处理、流媒体、深度学习、人工智能等多个方向具备实战开发经验和技术积累,共发表发明专利十余项,软件著作权几十项。商务合作和推广,可私信联系。
展开
-
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。原创 2024-06-03 07:27:56 · 1701 阅读 · 25 评论 -
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。原创 2024-06-04 05:46:24 · 613 阅读 · 15 评论 -
C++ 20新特性之指定初始化器
为了解决聚合初始化无法指定某些成员变量进行初始化的问题,C++ 20中引入了指定初始化器。指定初始化器允许在初始化结构体、联合体或类的对象时,明确指定成员变量的初始化。这一特性比较适用于大型或复杂的结构体,当我们只想初始化部分成员,或者想明确指出每个成员的初始值时,非常有用。注意:并非所有的类和结构体都能使用指定初始化器。为了使用该特性,类和结构体必须满足以下两个条件。1、必须是聚合类型,这就意味着,没有自定义构造函数,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数。原创 2024-06-05 07:41:49 · 1188 阅读 · 21 评论 -
C++ 20新特性之std::format
在C++ 20之前,我们通常使用printf、stringstream、cout等流对象,并结合各种流操作符(比如:原创 2024-06-07 07:17:32 · 1128 阅读 · 10 评论 -
C++ 20新特性之三向比较运算符
三向比较运算符,即,通常称为“太空船运算符”(Spaceship operator)。这个运算符的设计初衷是为了简化用户自定义类型的比较操作,以前需要分别重载、==等多个比较运算符,而现在仅需一个运算符就能完成所有比较逻辑的定义。运算符在内部执行两个操作数的比较,并根据它们的相对大小返回一个特殊类型。这个类型属于std::compare_three_way的结果类型分类,具体可以是以下三种。原创 2024-06-08 06:46:18 · 1381 阅读 · 31 评论 -
C++ 20新特性之Ranges
任何可以被迭代的对象都可以视为Ranges,包括标准库容器(比如:vector、list、map等)、数组,甚至是由函数生成的连续或非连续元素序列。Ranges提供了一组函数和操作符,让我们能够以更加函数式的方式处理容器中的数据。这些函数和操作符通常与现有的STL算法具有相同的功能,但它们更简洁,也更易于使用。原创 2024-06-10 09:38:13 · 1460 阅读 · 18 评论 -
C++ 20新特性之Lambda优化
自从C++ 11标准引入Lambda表达式以来,它已经成为现代C++编程中不可或缺的一部分,极大方便了我们的开发工作,提升了效率。而C++ 20对Lambda表达式的进一步优化和扩展,更是增强了其灵活性和实用性。原创 2024-06-11 06:30:00 · 418 阅读 · 10 评论 -
C++ 20新特性之进化的智能指针
智能指针作为C++ 11中自动管理内存的重要工具,包括:std::unique_ptr、std::shared_ptr和std::weak_ptr等。C++ 20对这些智能指针做了进一步的优化和扩展,并引入了新的与内存管理和资源控制相关的功能。下面,我们对一些主要的优化点进行详细的介绍。原创 2024-06-12 07:20:34 · 1103 阅读 · 25 评论 -
C++ 20新特性之范围for初始化
在C++ 20之前,使用范围for循环时,必须预先声明迭代变量。这在绝大部分场景下,显得非常繁琐和冗余。在C++ 20中,可以直接在范围for循环中初始化集合。这一改进极大提升了代码的简洁性和易读性,允许开发者在一个循环头部声明并初始化集合,避免了单独的变量声明步骤。对于只需要在循环内部使用的临时集合,这个新特性避免了额外的变量声明,使得代码更加紧凑。另外,范围for初始化将集合的初始化与遍历逻辑紧密结合,使得代码逻辑更加直观,减少了因忘记初始化或错误使用外部变量导致的潜在错误。原创 2024-06-13 07:35:01 · 528 阅读 · 5 评论 -
C++ 20新特性之constexpr与consteval
C++ 20在编译时计算和模板元编程方面引入了一些比较重要的改进,其中,constexpr和consteval关键字是两个核心特性,大大增强了C++在编译时执行代码的能力。这两个关键字与C++的泛型编程、模板元编程紧密相关,能够帮助开发者编写出既高效又灵活的代码。原创 2024-06-14 07:24:45 · 781 阅读 · 11 评论 -
C++ 20新特性之线程与jthread
C++ 20中新引入的std::jthread解决了C++ 11中std::thread的一些不便之处,特别是在线程生命周期管理上的自动化处理。std::jthread是一个智能指针风格的类,它自动join或detach与之关联的线程,从而避免了潜在的资源泄露问题。原创 2024-06-15 07:39:11 · 1434 阅读 · 10 评论 -
C++ 20新特性之std::span
实际上,std::span是一个非常实用的容器适配器,用于表示连续的内存区域。它并不直接拥有数据,而是提供了一种访问现有数组或容器元素的方式,增强了代码的灵活性和泛型性。std::span可以看作是对指针和长度对的一个类型安全、范围安全的封装,特别适合用于算法和接口设计中,以提高代码的可重用性和安全性。原创 2024-06-17 07:03:38 · 1700 阅读 · 25 评论 -
C++ 20新特性之原子引用
原子引用std::atomic_ref是C++ 20中新引入的一个模板类,它允许我们以原子方式访问和修改非原子类型的对象。与传统的原子类型std::atomic不同,原子引用并不直接存储数据,而是引用了一个已存在的非原子类型对象。这使得可以在不改变对象类型的情况下,为其提供原子访问能力。在很多项目中,程序的数据结构已经定义完成。出于性能或兼容性考虑,直接修改数据结构以增加原子性可能有点不切实际,甚至代价特别高昂。原创 2024-06-18 07:01:39 · 803 阅读 · 13 评论 -
C++ 20新特性之自定义删除器
在C++中,new操作符用于在堆上分配内存,delete操作符用于释放这些内存。然而,在某些情况下,我们可能需要管理其他类型的资源,比如:文件句柄、套接字句柄、数据库连接、自定义的内存池等。对于这些资源,delete操作符显然是不适用的。因此,我们需要自定义删除器来指定如何释放这些资源。在C++ 20中,删除器的概念得到了进一步的加强和扩展。它们在管理资源,尤其是智能指针的生命周期中扮演着至关重要的角色。删除器是一种设计模式,用于定制资源释放的方式。原创 2024-06-19 07:29:15 · 397 阅读 · 10 评论 -
C++ 20新特性之改进的位操作
C++ 20在位操作方面带来了显著的改进和新功能,旨在让位级别的操作更加高效、安全且易于理解。这些改进不仅增强了标准库中的位操作支持,还通过引入新的算法和类型提升了位操作的表达力。C++ 20中这些改进的位操作避免了直接使用位运算符进行复杂的位操作,降低了出错的可能性,提高了代码的可读性和可维护性。原创 2024-06-20 08:26:27 · 629 阅读 · 5 评论 -
C++ 20新特性之属性的标准化
在C++ 20之前,属性通常是通过特定的预处理指令或编译器特定的语法来实现的。在C++ 20中,属性被纳入了标准,使得它们在不同的编译器之间更加一致,也更易移植。通过属性,我们可以为代码中的实体(比如:类、函数、变量等)添加元数据。这些元数据可以用于各种目的,包括:编译器优化、代码分析、文档生成等。C++ 20中的属性使用“[[ ]]”语法来定义,并且可以与多种实体一起使用。接下来,我们将介绍一些常用的属性。原创 2024-06-24 06:30:00 · 779 阅读 · 20 评论 -
C++ 20新特性之语法糖
C++ 20中引入了一些简化编程工作的语法上的新特性,我们暂且美其名曰:“语法糖”。下面,我们将对这些“语法糖”一一进行介绍。原创 2024-06-25 07:22:01 · 1037 阅读 · 20 评论 -
C++ 20新特性之模块
在C++ 20之前,所有的代码组织都依赖于预处理器和头文件。这种方式主要存在以下四个问题:一是大型项目中,相同的头文件会被多次包含,导致编译时间延长;二是头文件之间复杂的相互引用关系难以管理,容易造成编译时错误;三是全局命名空间污染,不同的库可能定义相同的名字,导致冲突;四是修改一个头文件往往需要重新编译所有依赖它的源文件原创 2024-06-26 07:05:53 · 1045 阅读 · 6 评论