当前位置: 首页 > news >正文

(C++进阶)C++20

目录

一、概述

二、新特性

1. 模块(Modules)功能

2. 概念(Concepts)功能

3. 范围(Ranges)功能

4. 协程(Coroutines)功能

5. 三路比较运算符(Spaceship Operator)功能

6. std::format功能

7. 位操作增强

8. 空指针比较

一、概述

C++20作为C++语言的一个重要更新,引入了许多提升编程效率和代码质量的新特性。

二、新特性

1. 模块(Modules)功能

模块旨在替换传统的头文件 #include模型,以减少编译时间和改善依赖管理。

代码示例:

// my_module.module
export module my_module;
export void greet()
{std::cout << "Hello from the module!" << std::endl;
}// main.cpp
import my_module;
int main() 
{greet();return 0;
}

2. 概念(Concepts)功能

概念允许在编译时精确指定模板参数需满足的条件,增强编译时错误信息和泛型编程的清晰度。

代码示例:

#include <concepts>
template <typename T>
concept Integral = std::is_integral_v<T>;template<Integral T>
T abs(T x) 
{return x >= 0 ? x : -x;
}int main() 
{static_assert(abs(42) == 42);static_assert(abs(-42) == 42);// static_assert(abs(42.0) == 42.0); // 错误,double不满足Integral概念return 0;
}

3. 范围(Ranges)功能

范围库扩展了标准库中的算法,支持更简洁、更灵活的序列操作。

代码示例:

#include <range/v3/all.hpp>
#include <iostream>
int main() 
{std::vector<int> vec = {1, 2, 3, 4, 5, 6};auto even = vec | ranges::view::filter([](int x) { return x % 2 == 0; });for (int val : even) {std::cout << val << " ";}return 0;
}

4. 协程(Coroutines)功能

正式支持协程,使得编写异步代码更为直观。

代码示例(简化的生成器示例):

#include <coroutine>
#include <iostream>struct Generator 
{struct promise_type;using handle_t = std::coroutine_handle<promise_type>;Generator(handle_t h) : coro(h) {}~Generator() { if (coro) coro.destroy(); }int next() {coro.resume();return coro.promise().current_value;}private:handle_t coro;
};struct Generator::promise_type 
{int current_value{0};Generator get_return_object() { return Generator{handle_t::from_promise(*this)}; }std::suspend_always initial_suspend() { return {}; }std::suspend_always final_suspend() noexcept { return {}; }void return_value(int value) { current_value = value; }void unhandled_exception() { std::terminate(); }
};Generator count_up_to(int limit) 
{for (int i = 1; i <= limit; ++i) {co_yield i;}
}int main() 
{for (int val : count_up_to(5)) {std::cout << val << " ";}return 0;
}

5. 三路比较运算符(Spaceship Operator)功能

引入了<=>运算符,用于实现综合比较(小于、等于、大于)。

代码示例:

#include <compare>
struct Point 
{int x, y;auto operator<=>(const Point&) const = default;
};int main() 
{Point p1{1, 2}, p2{1, 2};if (p1 == p2) std::cout << "Equal" << std::endl;return 0;
}

6. std::format功能

std::format 是 C++20 引入的标准库函数,它为字符串格式化提供了统一且强大的接口,类似于 Python 中的 str.format 或 C 的 printf 函数,但更加安全和灵活。

代码示例:

#include <format>
#include <iostream>int main() 
{auto str = std::format("The answer is {}.", 42);std::cout << str << std::endl; // 输出: The answer is 42.return 0;
}

7. 位操作增强

C++20 对位操作进行了增强,引入了几个新函数来提高位操作的便利性和表达能力:①std::bit_cast<>:

允许在 trivially_copyable 类型之间直接转换比特模式。

②std::has_single_bit():

检查给定的整数是否是 2 的幂。

③std::countl_zero() 和 std::countr_zero():分别从左和从右开始计算连续的零位数量。④std::popcount():

计算一个整数中设置为 1 的位数。

代码示例(使用 std::has_single_bit 和 std::countl_zero):

#include <bit>
#include <iostream>int main() 
{unsigned int num = 0b100000;std::cout << "Is power of 2? " << std::boolalpha << std::has_single_bit(num) << std::endl;std::cout << "Leading zeros: " << std::countl_zero(num) << std::endl;return 0;
}

8. 空指针比较

C++20 引入了新的空指针常量 nullptr 与整数类型的比较操作,明确禁止了这种比较,以防止潜在的逻辑错误。 以前,比较 nullptr 和整数在某些实现下是允许的,但现在这样的比较会引发编译错误,确保了代码的清晰和安全。

代码示例(演示非法比较):

void checkPointer(int* ptr) 
{// if (ptr == 0) // {    // 在C++20中,这种比较会被认为是错误的// std::cout << "ptr is null" << std::endl;// }if (!ptr) { // 推荐的检查空指针方式std::cout << "ptr is null" << std::endl;}
}int main() 
{checkPointer(nullptr);return 0;
}

相关文章:

(C++进阶)C++20

目录 一、概述 二、新特性 1. 模块&#xff08;Modules&#xff09;功能 2. 概念&#xff08;Concepts&#xff09;功能 3. 范围&#xff08;Ranges&#xff09;功能 4. 协程&#xff08;Coroutines&#xff09;功能 5. 三路比较运算符&#xff08;Spaceship Operator&a…...

【常用的安装破解版指令】MAC安装破解版软件显示文件损坏时

MAC安装破解版软件显示文件损坏时 复制以下命令粘贴到终端后 sudo xattr -rd com.apple.quarantine 打开Finder&#xff08;访达&#xff09;&#xff0c;点击左侧的 应用程序&#xff0c;将应用拖进终端中&#xff0c;然后按键盘的回车键&#xff08;return&#xff09;&…...

【QT Quick】定时器和线程:定时器Timer

在现代用户界面开发中&#xff0c;动态更新内容、处理定时任务或异步任务是常见的需求&#xff0c;尤其在复杂应用中可能会遇到界面阻塞的问题。在 Qt Quick 中&#xff0c;定时器&#xff08;Timer&#xff09;和多线程是两种主要的解决方案&#xff0c;用于避免这种阻塞现象。…...

【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解

目录 1、NIO 2、NIO 和 IO 的区别 1. 阻塞 vs 非阻塞 2. 一个线程 vs 多个连接 3. 面向流 vs 面向缓冲 4. 多路复用 3、Channel & Buffer (1&#xff09;Channel&#xff1a;双向通道 (2&#xff09;Buffer&#xff1a;缓冲区 (3&#xff09;ByteBuffer&#xff…...

HDLBits中文版,标准参考答案 | 3.1.3 Arithmetic Circuits | 算术电路

关注 望森FPGA 查看更多FPGA资讯 这是望森的第 10 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 Half adder | 半加器 2 Full adder | 全加器 3 3-bit binary adder | 3位二进制加法器 4 Adder | 加法器 5 Signed addition overflow | 有符号数的加法溢出 6 100-bit bi…...

网络编程 websocket

1. HTTP 截至 2024 年&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff09;已经发展到 HTTP/3 版本。 各个版本的简介&#xff1a; HTTP/0.9&#xff08;1991年&#xff09;&#xff1a; 最初的 HTTP 版本&#xff0c;非常简单&#xff0c;仅支持 GET 方法…...

【JDK17 | 5】Java 17 深入剖析:新的随机数生成器 API

引言 在 Java 17 中&#xff0c;新的随机数生成器 API 作为一个重要特性被引入&#xff0c;旨在提供更灵活和高效的随机数生成方案。新的 API 不仅支持多种生成算法&#xff0c;还改善了随机数生成的性能&#xff0c;适应了现代开发的需求。在本篇文章中&#xff0c;我们将深入…...

剪切走的照片:高效恢复与预防策略

一、剪切走的照片现象描述 在日常的数字生活中&#xff0c;照片作为记录生活点滴、工作成果的重要载体&#xff0c;其重要性不言而喻。然而&#xff0c;有时我们可能会遇到一种令人头疼的情况&#xff1a;原本打算通过剪切操作将照片移动到另一个位置&#xff0c;却意外地发现…...

基于XGBoost的结核分枝杆菌的耐药性预测研究【多种机器学习】

1. 绪论 目录 1. 绪论 1.1研究背景及意义 1.2国内外研究现状 1.2.1国内研究现状 1.2.2国外研究现状 1.3研究目的 2. 相关技术概念 2.1结核分枝杆菌的耐药性机制 2.2机器学习与系统发育法相结合 2.3XGBoost和随机森林算法的优势和应用 3. 模型设计 3.1数据准备与预…...

【C++差分数组】3229. 使数组等于目标数组所需的最少操作次数|2066

本文涉及知识点 C差分数组 LeetCode3229. 使数组等于目标数组所需的最少操作次数 给你两个长度相同的正整数数组 nums 和 target。 在一次操作中&#xff0c;你可以选择 nums 的任何子数组&#xff0c;并将该子数组内的每个元素的值增加或减少 1。 返回使 nums 数组变为 tar…...

浅谈PyTorch中的DP和DDP

目录 1. 引言2. PyTorch 数据并行&#xff08;Data Parallel, DP&#xff09;2.1 DP 的优缺点2.2 DP 实现代码示例 3. PyTorch 分布式数据并行&#xff08;Distributed Data Parallel, DDP&#xff09;3.1 DDP 的优缺点3.2 分布式基本概念3.3 DDP 的应用流程3.5 DDP 实现代码示…...

在Windows上利用谷歌浏览器进行视频会议和协作

随着远程工作和在线教育的普及&#xff0c;使用谷歌浏览器在Windows上进行视频会议和协作变得越来越常见。本文将为您提供一个详细的教程&#xff0c;教您如何在Windows上利用谷歌浏览器进行视频会议和协作&#xff0c;同时解决一些常见的问题。&#xff08;本文由https://goog…...

VMware Fusion 13.6.1 发布下载,修复 4 个已知问题

VMware Fusion 13.6.1 发布下载&#xff0c;修复 4 个已知问题 VMware Fusion 13.6.1 for Mac - 领先的免费桌面虚拟化软件 适用于基于 Intel 处理器和搭载 Apple 芯片的 Mac 的桌面虚拟化软件 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-fusion-13/ 查看最新…...

P9751 [CSP-J 2023] 旅游巴士

P 9751 P9751 P9751 部分分思路 题目要求时间必须是 k k k 的非负整数倍&#xff0c;所以想到了升维。这样就变成了一道分层图最短路的题目。用 BFS 算法可以拿到 A i 0 A_i0 Ai​0 的 35 35 35 分。 满分思路 其实部分分的思路已经很接近正解了&#xff0c;想要拿到满…...

【Linux】man手册安装使用

目录 man(manual,手册) 手册安装: 章节区分&#xff1a; 指令参数: 使用场景&#xff1a; 手册内容列表: 手册查看快捷键: 实例: 仍致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 在开头先提醒一下:在 man 手册中退出的方法很简单…...

mysql学习教程,从入门到精通,SQL处理重复数据(39)

1、SQL处理重复数据 使用GROUP BY和HAVING子句删除重复数据&#xff08;以SQL Server为例&#xff09;”的背景和原理的详细解释&#xff1a; 1.1、背景 在数据库管理中&#xff0c;数据重复是一个常见的问题。重复数据可能由于多种原因产生&#xff0c;如数据录入错误、数据…...

mapbox解决wmts请求乱码问题

贴个群号 WebGIS学习交流群461555818&#xff0c;欢迎大家 事故现场 如图所示&#xff0c;wmts请求全是乱码&#xff0c;看起来像是将一个完整的请求拆成一个一个的字母了&#xff0c;而且控制台打印map.getStyle() 查看该source发现不出异常 解决办法 此类问题就是由于更…...

《C++职场中设计模式的学习与应用:开启高效编程之旅》

在 C职场中&#xff0c;设计模式是提升代码质量、增强程序可维护性和可扩展性的强大武器。掌握并正确应用设计模式&#xff0c;不仅能让你在工作中更加得心应手&#xff0c;还能为你的职业发展增添有力的砝码。那么&#xff0c;如何在 C职场中学习和应用设计模式呢&#xff1f;…...

Maya动画--基础约束

005-基础约束02_哔哩哔哩_bilibili 父子约束 移动圆环&#xff0c;球体会跟着移动&#xff0c;并回到初始的相对位置 不同物体间没有层级关系 明确子物体与父物体间的关系 衣服上的纽扣 法线约束 切线约束 碰到中心时会改变方向...

腾讯云License 相关

腾讯云视立方 License 是必须购买的吗&#xff1f; 若您下载的腾讯云视立方功能模块中&#xff0c;包含直播推流&#xff08;主播开播和主播观众连麦/主播跨房 PK&#xff09;、短视频&#xff08;视频录制编辑/视频上传发布&#xff09;、终端极速高清和腾讯特效功能模块&…...

开放式耳机什么品牌最好?十大超好用开放式耳机排名!

由于长时间使用传统入耳式耳机可能会对耳道健康带来潜在的负面影响&#xff0c;越来越多的用户倾向于选择开放式耳机&#xff0c;这种设计不侵入耳道。它有助于降低耳内湿度、减少细菌滋生&#xff0c;以及缓解耳道因封闭而过热的不适。但是大部分人还是不知道怎么选择开放式耳…...

基于Zynq SDIO WiFi移植二(支持2.4/5G)

1 SDIO设备识别 经过编译&#xff0c;将移植好的uboot、kernel、rootFS、ramdisk等烧录到Flash中&#xff0c;上电启动&#xff0c;在log中&#xff0c;可看到sdio设备 [ 1.747059] mmc1: queuing unknown CIS tuple 0x01 (3 bytes) [ 1.761842] mmc1: queuing unknown…...

Spring Boot敏感数据动态配置:深入实践与安全性提升

在构建Spring Boot应用的过程中&#xff0c;敏感数据的处理与保护是至关重要的。传统上&#xff0c;这些敏感数据&#xff08;如数据库密码、API密钥、加密密钥等&#xff09;可能被硬编码在配置文件中&#xff0c;这不仅增加了泄露的风险&#xff0c;也限制了配置的灵活性和可…...

软考数据库部分 ---- (概念数据库模型,三级模式,两级映像,事物管理)

文章目录 一、概念数据库模型二、结构数据库模型三、三级模式四、两级映像五、关系模式基本术语六、关系模式七、关系的数学定义八、数据定义语言九、SQL访问控制十、视图十一、索引十二、关系模式十三、范式十四、数据库设计十五、事物管理&#xff08;ACID&#xff09;十六、…...

AI 概念大杂烩

目录 介绍 数据挖掘 / 机器学习 / 深度学习 一、数据挖掘&#xff08;Data Mining&#xff09; 1. 定义 2. 目标 3. 常用算法 二、机器学习&#xff08;Machine Learning&#xff09; 1. 定义 2. 目标 3. 常用算法 三、深度学习&#xff08;Deep Learning&#xff0…...

Composer和PHP有什么关系

Composer是PHP的一个依赖管理工具&#xff0c;以下是对Composer及其与PHP关系的详细解释&#xff1a; Composer简介 核心功能&#xff1a;Composer的核心思想是“依赖管理”&#xff0c;它能够自动下载和安装项目所依赖的库、框架或插件等。这些依赖项可以是PHP本身的库文件&…...

【PGCCC】在 Postgres 上构建图像搜索引擎

我最近看到的最有趣的电子商务功能之一是能够搜索与我手机上的图片相似的产品。例如&#xff0c;我可以拍一双鞋或其他产品的照片&#xff0c;然后搜索产品目录以查找类似商品。使用这样的功能可以是一个相当简单的项目&#xff0c;只要有合适的工具。如果我们可以将问题定义为…...

性能测试之性能问题分析

开始性能测试前需要了解的内容&#xff1a; 1、项目具体需求。 2、指标&#xff1a;响应时间在多少以内&#xff0c;并发数多少&#xff0c;tps多少&#xff0c;总tps多少&#xff0c;稳定性交易总量多少&#xff0c;事务成功率&#xff0c;交易波动范围&#xff0c;稳定运行…...

错过了A股,别再错过AI表情包!N款变现攻略,你选哪个?

本文背景 据 Swyft Media 统计&#xff0c;全世界每天各类聊天 app 发送的表情符号有 60 多亿&#xff0c;我们国家每天表情包发送量大概 6 亿次。 表情包简直就是个大淘金池&#xff0c;最近用 AI 做表情包也挺火。所以今天给大家讲讲一个用 AI 做表情包变现的项目。 以前没…...

SpringBoot驱动的美发沙龙管理系统:优雅地管理您的业务

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理美发门店管理系统的相关信息成为必然。开发…...