C++ 新特性 | C++20 常用新特性介绍

news2024/11/14 16:55:07

目录

1、模块(Modules)

2、协程(Coroutines)

3、概念(Concepts)

4、范围(Ranges)

5、三向比较符(three-way comparison)


C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C/C++实战进阶(专栏文章已更新390多篇,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.htmlWindows C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_2276111.html       C++20是C++标准委员会于2020年12月发布的新标准,作为C++17的后继版本,C++20引入了许多新的特性和改进,旨在提高C++的表现力、可读性和可维护性,同时保持其高效性和灵活性。下面介绍一下C++20的一些新特性。

  • 很多C++开源库会大规模地使用C++11及以上的新特性,比如WebRTC开源库,所以在阅读开源代码时需要了解C++11及以上新特性。我们在日常编码中会用到部分新特性,比如一些新的关键字(auto、nullptr、override、final等)、lambda表达式(匿名函数)、智能指针等。此外,现在很多C++开发岗位在面试时都会问到C++11或以上的新特性方面的内容。所以学习C++11及以上的新特性很有必要!
  • C++新标准引入的诸多新特性,解决了语言上的部分缺陷,使得C++更得加高效灵活!但也使得C++变得更加臃肿复杂,更加难以驾驭!

1、模块(Modules)

       C++20中的模块(Modules)是用来取代头文件包含(include)的一种新的代码组织方式。模块可以提高编译速度,也增加了封装性。

       使用模块的步骤如下:
1)创建模块接口文件(.ixx文件),定义要导出的接口:

// hello.ixx
export module hello;

export void sayHello();

2)创建模块实现文件(.cpp文件),实现接口:

// hello.cpp
module hello;

void sayHello() 
{
  std::cout << "Hello World!\n"; 
}

3)在使用模块的文件中导入模块:

// main.cpp 
import hello;

int main() 
{
  sayHello();
}

4)编译时需要添加-fmodules-ts参数。

       模块的好处是可以明确定义公开的接口,也避免头文件包含导致的重复定义等问题。编译生成的二进制格式可以跨平台兼容。但模块目前还没有被所有编译器广泛支持。


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:(该精品技术专栏的订阅量已达到500多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:  

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795

常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏3:(本专栏涵盖了多方面的内容,是当前重点打造的专栏,专栏文章已经更新到390多篇,持续更新中...)

C/C++实战进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。

专栏4:   

VC++常用功能开发汇总(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5: 

Windows C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了Windows C++ 应用软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


2、协程(Coroutines)

       C++20引入了协程支持,执行一些异步的任务,使得异步编程更加方便和可读。协程是一种轻量级的并发机制,可以简化异步编程和无阻塞IO的处理。

      协程的基本语法是:

// 定义一个协程
coroutine<返回值类型> 协程名称();

// 使用 co_await 语句暂停/恢复协程
co_await some_expression; 

// 协程最后需要一个 co_return 语句返回值
co_return some_value;

       使用协程的实例:

#include <coroutine>

task<int> getValue() 
{
  int value = co_await getValueFromNetwork();
  
  // do something
 
  co_return value; 
}

int main() 
{
  auto result = getValue(); // 不会堵塞
  
  auto value = result.get(); // 获取协程返回值
  
}

       在上面代码中,getValue() 被定义为一个协程,它可以通过co_await语句暂停自身,等待getValueFromNetwork()完成网络操作后再继续执行。

       主函数调用getValue()只会启动协程任务,并不会堵塞,可以同时干其他事情。后面再通过result.get()来获取协程执行结束后的返回值。这样就可以实现一种异步的编程模式了。

3、概念(Concepts)

       C++20引入了概念(Concepts),这是一种新的语言特性,用于对模板参数进行约束。它允许开发者以更直观和可理解的方式表达模板的约束条件,从而简化模板编程并提高代码的可读性。概念可以明确地指定模板参数需要满足的要求,使代码更清晰易懂。

       定义一个概念的语法如下:

template <typename T>
concept MyConcept = requires(T t) {
  t.someOperation();
};

      实例1:限定类型必须是可increment的:

concept Incrementable = requires(T x) {
  ++x; // 必须支持++运算  
};

template <Incrementable T>
void incTwice(T &num) 
{
  ++num;
  ++num;
}

incTwice(a); // 编译失败,如果a不支持++

      实例2:限定类型必须可比较:

concept EqualityComparable = requires(T a, T b) {
  {a == b} -> bool; // 必须可比较
};

template <EqualityComparable T>
bool isEqual(T a, T b) {
  return a == b; 
}

       实例3:使用嵌套约束:

concept NestedConstraint = EqualityComparable && Incrementable; 

template <NestedConstraint T>
void func(T x) {
  //...
}

       实例4:约束类的属性和行为:

concept Drawable = requires(T x) {
  x.draw();   // 必须有draw方法
  x.x;        // 必须有x坐标
  x.y;        // 必须有y坐标
};

       以前在C++模板中,无法对传递进来的类型进行有效性检查,只能简单地使用或不使用,容易造成难以调试的错误,概念允许我们明确地定义模板参数需要满足哪些条件,比如必须有某个成员函数,必须可转换为某种类型等。如果传入的类型不满足概念的要求,会直接导致编译错误,使问题更早暴露。

4、范围(Ranges)

      C++20新增了一个统一且功能强大的范围操作库,简化了对容器、视图以及迭代器的处理。Ranges库提供了一套丰富的算法和工具,使得处理数据序列变得更加直观和高效。

      Ranges库主要特点包括:

  • 引入范围range的抽象概念,如数组、容器都可以视为一个range。
  • 统一开始和结束的迭代器概念为range的begin和end。
  • 算法可以直接作用于不同的range上,而不仅仅是容器。
  • 支持各种新的range Adaptor,可以将范围进行转换、过滤等。

下面是一个使用范围的简单例子:

#include <iostream>
#include <ranges>
#include <vector>

int main() 
{
  std::vector<int> vec = {1, 2, 3, 4, 5}; 

  // 用基于范围的for循环迭代
  for (int i : vec | std::views::filter([](int i){return i % 2 == 0;})) 
  {
    std::cout << i << " "; 
  }

  // 输出:2 4
}

这里通过views::filter() adapter将vec转换为一个过滤后的range,然后用range-based for循环进行迭代。

       这种基于范围的编程方式可以大大简化迭代操作,而且可重用性强,非常适合函数式编程范式。

       算法作用于范围的实例:

std::vector<int> vec = {3,1,4,5,2};

std::ranges::sort(vec); 

// 输出 1 2 3 4 5
for (int i : vec) 
{
  std::cout << i << " ";
}

总之,范围大大简化了迭代器和算法的使用,是C++现代化编程方式的重要进步。

5、三向比较符(three-way comparison)

       C++20 引入了 <=> 三向比较运算符,可以用来替代之前的 ==,!=,<,<=,>]>= 等二元比较运算符。三向比较运算符按照下面的规则进行比较:

  • 如果左边小于右边,返回 -1
  • 如果左边等于右边,返回 0
  • 如果左边大于右边,返回 1

      一些使用三向比较运算符的示例:

int a = 1, b = 2;

if (a <=> b == -1) {
  // a < b
} 

if (a <=> b == 0) { 
  // a == b
}

if (a <=> b == 1) {
  // a > b
}

std::sort(vec.begin(), vec.end(), [](int a, int b) {
  return a <=> b; // 升序
});

       三向比较运算符提高了代码可读性,也统一了所有比较操作的方式。编译器可以更好地优化三向比较。总体来说,三向比较使代码更简洁易读,也更符合现代C++的编程思想,可以替代传统的二元比较运算符。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哈尔滨等保测评——为工业网络安全保驾护航新航标

哈尔滨&#xff0c;这个以冰雪和美丽闻名世界的城市&#xff0c;现在又树立了一个全新的行业标准&#xff0c;那就是“等保”&#xff0c;正在掀起一场新的安全革命&#xff0c;保卫着这个智能时代&#xff01; ❄️【哈尔滨新视野】❄️ 哈尔滨是一块充满创新活力的土地&…

数据结构之Map和Set(下)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 上一篇文章&#xff0c;我们学习了&#xff1a;二叉搜索树、Map和Set的介绍以及常见方法的基本使用…

充电宝啥牌子质量好性价比高?探寻性价比高充电宝!

这个移动设备无处不在的时代&#xff0c;充电宝已经成为我们生活中不可或缺的配件。然而&#xff0c;面对市场上琳琅满目的充电宝品牌和型号&#xff0c;许多人在选择时往往感到困惑。如何找到一款质量好、性价比高的充电宝&#xff0c;成为了众多消费者关注的焦点。本文将带您…

SpringMVC (发送请求——>参数传递—— >响应数据)

设置请求访问路径 RequestMapper&#xff1a;将请求访问路径和我们业务层的方法联系起来 ResponseBody&#xff1a;将我们业务层方法的返回值转化为json&#xff0c;xml或其他格式的数据返回给页面 两种请求 get请求 post请求 测试案例 RequestMapping("/getNameAndAge&…

Linux逻辑卷管理LVM

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 1.Linux介绍、目录结构、文件基本属性、Shell 2.Linux常用命令 3.Linux文件管理 4.Linux 命令安装(rpm、install) 5.Linux账号管理 6.Linux文件/目录权限管理 7.Linux磁盘管理/文件系统 提示&a…

应急响应:Windows 入侵排查思路.

什么是应急响应. 一个组织为了 应对 各种网络安全意外事件的发生 所做的准备 以及在 事件发生后 所采取的措施 。说白了就是别人攻击你了&#xff0c;你怎么把这个攻击还原&#xff0c;看看别人是怎么攻击的&#xff0c;然后你如何去处理&#xff0c;这就是应急响应。 目录&am…

数字货币市场历史数据获取API(含源代码)

加密数字货币市场历史数据获取API&#xff08;含源代码&#xff09; 数字货币市场历史数据获取API&#xff08;含源代码&#xff09;1. Binance API运行结果BTCUSDT.csv 文件截图 2. CoinGecko API3. CryptoCompare API总结 数字货币市场历史数据获取API&#xff08;含源代码&a…

【机器学习算法基础】(基础机器学习课程)-11-k-means-笔记

示例案例 为了更好地理解 K-Means 算法&#xff0c;下面通过一个简单的案例进行说明。 假设我们有以下 10 个二维数据点&#xff0c;表示不同商店的销售额&#xff08;单位&#xff1a;千元&#xff09;和顾客数&#xff08;单位&#xff1a;人&#xff09;&#xff1a; [(1…

zabbix的自动发现和注册、proxy代理和SNMP监控

一、zabbix自动发现和注册 1.概念 zabbix客户端主动的和服务端联系&#xff0c;将自己的地址和端口发送给服务端&#xff0c;实现自动添加监控主机。 客户端是主动的一方 缺点&#xff1a;自定义网段中主机数量太多&#xff0c;登记耗时会很久&#xff0c;而且这个自动发现…

多参数MRI靶向活检与系统性活检在筛查筛状和导管内癌前列腺癌中的比较| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Comparison of Multiparametric MRI–targeted and Systematic Biopsies for Detection of Cribriform and Intraductal Carcinoma Prostate Cancer 多参数MRI靶向活检与系统性活检在筛查筛状和导管内癌前列腺癌中的比较 Background 背景 Intraductal carcin…

婴儿浴缸及沐浴辅助用品 亚马逊澳大利亚站认证

本政策涵盖的婴儿浴缸及沐浴辅助用品 婴儿沐浴辅助用品用于为婴儿提供支撑&#xff0c;以便成人可以腾出手来为婴儿沐浴。商品设计多种多样&#xff0c;可能随婴儿浴缸一起提供&#xff0c;也可能塑造成婴儿浴缸的形状&#xff0c;也可能设计为淋浴时使用的椅子。婴儿沐浴辅助…

制造知识普及(十)-- 常见的工业软件介绍

「 1. ERP」 企业资源计划&#xff08;enterprise resource planning&#xff0c;ERP&#xff09;是制造企业的核心管理软件。ERP系统的基本思想是以销定产&#xff0c;协同管控企业的产、供、销、人、财、物等资源&#xff0c;帮助企业按照销售订单&#xff0c;基于产品的制造…

十一、vector 类

Ⅰ . vector 的介绍和使用 01 vector 的介绍 vector 的文档介绍&#xff1a;vector ① vector 是表示可变大小数组的序列容器&#xff0c;既像数组&#xff0c;又不像数组 像体现在&#xff1a;同样采用连续存储空间存储元素&#xff0c;可以使用下标访问元素 不像体现在&…

ffmpeg -- 常用口令

文章目录 1.视频格式转换2.设置比特率3.设置帧率4.强制让输入视频帧率为1&#xff0c;输出视频帧率为245.长视频截短6.自动分割视频的bash脚本7.每一帧都保存成图片 1.视频格式转换 ffmpeg -i input.avi output.mp42.设置比特率 ffmpeg -i input.avi -b:v 64k -bufsize 64k o…

Kuboard v3安装手册

1、Kuboard v3安装 docker pull swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3 #启动kuboard容器 docker run -d \ --restartunless-stopped \ --namekuboard \ -p 8003:80/tcp \ -p 30081:10081/tcp \ -e KUBOARD_ENDPOINT"http://10.111.13.2:8003&q…

智能分析,安全无忧:AI视频分析技术在安全生产中的深度应用

在当今快速发展的科技时代&#xff0c;视频智能分析技术&#xff08;Intelligent Video Analysis&#xff0c;简称IV&#xff09;已经成为提升安全生产水平的重要手段。这一技术通过计算机图像视觉分析技术&#xff0c;实现了对场景中目标的自动识别和追踪&#xff0c;有效提升…

计算机毕业设计选题推荐-玩具租赁系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

网络规划设计师-(3)数据通信系统模型

数据通信系统模型是怎么组成的&#xff1f; 数据通信系统模型是由以下几个组成部分组成&#xff1a; 发送方&#xff08;Sender&#xff09;&#xff1a;发送方是数据通信系统中起始数据源的设备或程序。它将原始数据转化为适合传输的格式&#xff0c;并将数据发送到通信信道中…

企业管理咨询公司谈Poka-Yoke的三种方法

这听起来像是你玩的游戏&#xff0c;但 poka-yoke 这个词实际上是一个日语术语&#xff0c;它的意思是“防错”。作为一种质量工具&#xff0c;其背后的理念是每个人都会犯错&#xff0c;因为我们都是人。Poka-yoke 要么消除&#xff0c;要么至少大大减少了我们犯错的机会。此操…

中国进出口贸易公司 | 地毯进口有哪些要求 | 箱讯科技

地毯进口有哪些注意事项&#xff1f;根据制作方法、材质等方面的差异&#xff0c;地毯产品在进口申报时&#xff0c;其申报税号各有不同&#xff1b;还应关注地毯产品的质量安全及卫生环保情况&#xff0c;确保其符合中国相关强制性标准的要求。具体介绍如下。 进口地毯产品申报…