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

现代 c++ 一:c++11 ~ c++23 新特性汇总

所谓现代 c++,指的是从 c++11 开始的 c++,从 c++11 开始,加入一些比较现代的语言特性和改进了的库实现,使得用 c++ 开发少了很多心智负担,程序也更加健壮,“看起来像一门新语言”。

从 c++11 开始,每 3 年发布一个新版本,到今年(2024)已经有 5 个版本了,分别是 c++11、c++14、c++17、c++20、c++23,这 5 个版本引入了上百个新的语言特性和新的标准库特性。


c++11 新特性

c++11 是一个 major 版本,现代 c++ 开天辟地的版本,有特别多新东西。

新的语言特性[1]:

  • 内存模型——一个高效的为现代硬件设计的底层抽象,作为描述并发的基础
  • auto 和 decltype——避免类型名称的不必要重复
  • 范围 for——对范围的简单顺序遍历
  • 移动语义和右值引用——减少数据拷贝
  • 统一初始化—— 对所有类型都(几乎)完全一致的初始化语法和语义
  • nullptr——给空指针一个名字
  • constexpr 函数——在编译期进行求值的函数
  • 用户定义字面量——为用户自定义类型提供字面量支持
  • 原始字符串字面量——不需要转义字符的字面量,主要用在正则表达式中
  • 属性——将任意信息同一个名字关联
  • lambda 表达式——匿名函数对象
  • 变参模板——可以处理任意个任意类型的参数的模板
  • 模板别名——能够重命名模板并为新名称绑定一些模板参数
  • noexcept——确保函数不会抛出异常的方法
  • override 和 final——用于管理大型类层次结构的明确语法
  • static_assert——编译期断言
  • long long——更长的整数类型
  • 默认成员初始化器——给数据成员一个默认值,这个默认值可以被构造函数中的初始化所取代
  • enum class——枚举值带有作用域的强类型枚举

新的标准库特性[1]:

  • unique_ptr 和 shared_ptr——依赖 RAII 的资源管理指针
  • 内存模型和 atomic 变量
  • thread、mutex、condition_variable 等——为基本的系统层级的并发提供了类型安全、可移植的支持
  • future、promise 和 packaged_task,等——稍稍更高级的并发
  • tuple——匿名的简单复合类型
  • 类型特征(type trait)——类型的可测试属性,用于元编程
  • 正则表达式匹配
  • 随机数——带有许多生成器(引擎)和多种分布
  • 时间——time_point 和 duration
  • unordered_map 等——哈希表
  • forward_list——单向链表
  • array——具有固定常量大小的数组,并且会记住自己的大小
  • emplace 运算——在容器内直接构建对象,避免拷贝
  • exception_ptr——允许在线程之间传递异常

c++14 新特性

c++14 是一个 minor 版本,没什么重要的新特性,主要是在给 c++11 打补丁,为使用者 “带来极大方便”,实现 “对新手更为友好” 这一目标。

新的语言特性[2]:

  • 泛型的lambda
  • Lambda捕获部分中使用表达式
  • 函数返回类型推导
  • 另一种类型推断:decltype(auto)
  • 放松的constexpr函数限制
  • 变量模板
  • 聚合类成员初始化
  • 二进制字面量: 0b或0B 前缀
  • 数字分位符
  • deprecated 属性

新的标准库特性[2]:

  • 共享的互斥体和锁: std::shared_timed_mutex
  • 元函数的别名
  • 关联容器中的异构查找
  • 标准自定义字面量
  • 通过类型寻址多元组
  • 较小的标准库特性: std::make_unique, std::is_final 等

c++17 新特性

c++17 是一个 major 版本。

新的语言特性[3]:

  • 构造函数模板参数推导——简化对象定义
  • 推导指引——解决构造函数模板参数推导歧义的显式标注
  • 结构化绑定——简化标注,并消除一种未初始化变量的来源
  • inline 变量——简化了那些仅有头文件的库实现中的静态分配变量的使用
  • 折叠表达式——简化变参模板的一些用法
  • 条件中的显式测试——有点像 for 语句中的条件
  • 保证的复制消除——去除了很多不必要的拷贝操作
  • 更严格的表达式求值顺序——防止了一些细微的求值顺序错误
  • auto 当作模板参数类型——值模板参数的类型推导
  • 捕捉常见错误的标准属性——[[maybe_unused]]、[[nodiscard]] 和 [[fallthrough]]
  • 十六进制浮点字面量
  • 常量表达式 if——简化编译期求值的代码

新的标准库特性[3]:

  • optional、any 和 variant——用于表达“可选”的标准库类型
  • shared_mutex 和 shared_lock(读写锁)和 scoped_lock
  • 并行 STL——标准库算法的多线程及矢量化版本
  • 文件系统——可移植地操作文件系统路径和目录的能力
  • string_view——对不可变字符序列的非所有权引用
  • 数学特殊函数——包括拉盖尔和勒让德多项式、贝塔函数、黎曼泽塔函数

c++20 新特性

c++20 是一个 major 版本,有很重要的更新,“The Big Four”,即四个重要的特性,分别是:概念、范围、协程和模块。

新的语言特性[4]:

  • coroutines
  • concepts
  • designated initializers
  • template syntax for lambdas
  • range-based for loop with initializer
  • [[likely]] and [[unlikely]] attributes
  • deprecate implicit capture of this
  • class types in non-type template parameters
  • constexpr virtual functions
  • explicit(bool)
  • immediate functions
  • using enum
  • lambda capture of parameter pack
  • char8_t
  • constinit

新的标准库特性[4]:

  • concepts library
  • synchronized buffered outputstream
  • std::span
  • bit operations
  • math constants
  • std::is_constant_evaluated
  • std::make_shared supports arrays
  • starts_with and ends_with on strings
  • check if associative container has element
  • std::bit_cast
  • std::midpoint
  • std::to_array

c++23 新特性

c++23 是一个 minor 版本。

新的语言特性[5]:

  • 新语言功能特性测试宏
  • 显式对象形参,显式对象成员函数(推导 this)
  • if consteval / if not consteval
  • 多维下标运算符(例如 v[1, 3, 7] = 42;)
  • static operator()
  • static operator[]
  • auto(x):语言中的衰退复制
  • lambda 表达式上的属性
  • 可选的扩展浮点类型:std::float{16|32|64|128}_t 和 std::bfloat16_t。
  • (有符号)std::size_t 字面量的字面量后缀 ‘Z’/‘z’
  • 后缀
  • #elifdef、#elifndef 与 #warning
  • 通过新属性 [[assume(表达式)]] 进行假设
  • 具名通用字符转义
  • 可移植源文件编码为 UTF-8
  • 行拼合之前修剪空白

新的标准库特性[5]:

  • 新的库功能特性测试宏
  • 新的范围折叠算法
  • 字符串格式化改进
  • “平铺(flat)”容器适配器:std::flat_map、std::flat_multimap、std::flat_set、std::flat_multiset
  • std::mdspan
  • std::generator
  • std::basic_string::contains, std::basic_string_view::contains
  • 禁止从 nullptr 构造 std::string_view
  • std::basic_string::resize_and_overwrite
  • std::optional 的单子式操作:or_else、and_then、transform
  • 栈踪迹(stacktrace)库
  • 新的范围算法
  • 新的范围适配器(视图)
  • 对范围库的修改
  • 对视图的修改
  • 标记不可达代码:std::unreachable
  • 新的词汇类型 std::expected
  • std::move_only_function
  • 新的带有程序提供的固定大小缓冲区的 I/O 流 std::spanstream
  • std::byteswap
  • std::to_underlying
  • 关联容器的异质擦除

参考

[1] Bjarne Stroustrup. c++11:感觉像是门新语言. Cpp-Club. Available at : https://github.com/Cpp-Club/Cxx_HOPL4_zh/blob/main/04.md, 2023-6-11.

[2] Wikipedia. c++14. Available at: https://zh.wikipedia.org/wiki/c++14.

[3] 玩转Linux内核. 快速入门c++17:了解最新的语言特性和功能. Available at: https://zhuanlan.zhihu.com/p/664746128, 2023-11-06.

[4] AnthonyCalandra. modern-cpp-features:CPP20. Available at: https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP20.md, 2023-3-19.

[5] cppreference. c++23. Available at: https://zh.cppreference.com/w/cpp/23, 2024-3-3.

相关文章:

现代 c++ 一:c++11 ~ c++23 新特性汇总

所谓现代 c,指的是从 c11 开始的 c,从 c11 开始,加入一些比较现代的语言特性和改进了的库实现,使得用 c 开发少了很多心智负担,程序也更加健壮,“看起来像一门新语言”。 从 c11 开始,每 3 年发…...

【c++】全面理解C++多态:虚函数表深度剖析与实践应用

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,通过本篇文章,来详细理解多态的内容 目录 1.多态的定义及实现1.1多态的构成条件1.2虚函数的重写1.3 C11 override 和 final1.4重载、覆盖(重写)、隐藏…...

分享四种免费获取SSL的方式

SSL证书目前需要部署安装的网站很多,主要还是基于国内目前对证书的需求度在不断的升高,网站多了、服务器多了之后。网络安全问题就成为了大家不得不面对的一个重要的问题了。SSL证书的作用有很多,这里就不一一详述了,本期作品主要…...

2024.5.14晚训题解

非线性结构没懂的同学多去看看课程回放。 A题Overall Winner 题解 很基础的题目&#xff0c;输入字符串&#xff0c;用计数器去统计一下就好了。 因为赢的次数一样的时候优先判断前面的那个人赢&#xff0c;所以说两个人赢的次数相同的时候我们不必 去记录胜者。 #include<…...

jQuery的选择器与自带函数详解

在前端开发中&#xff0c;jQuery是一个广泛使用的JavaScript库&#xff0c;它极大地简化了HTML文档遍历、事件处理、动画以及AJAX交互等操作。本文将通过一个示例页面&#xff0c;详细介绍jQuery的选择器和一些常用的自带函数。 示例代码优化 首先&#xff0c;我们来优化和完…...

Next.js与SSR:构建高性能服务器渲染应用

1. 创建项目 通过create-next-app脚手架创建一个新的Next.js项目&#xff1a; npx create-next-app my-app cd my-app2. 自动SSR 在Next.js中&#xff0c;每个.js或.jsx文件的组件都会被自动处理为SSR页面。例如&#xff0c;创建一个pages/index.js文件&#xff1a; // pag…...

什么是MVC?什么是SpringMVC?什么是三层架构?

文章目录 应用分层什么是MVC?什么是 SpringMVC&#xff1f;三层架构三层架构和MVC的关系 应用分层 在讲解什么是MVC之前&#xff0c;先来理解一下什么是应用分层。 应用分层是一种软件开发设计思想&#xff0c;将应用程序划分成N个层次&#xff0c;每个层次都分别负责自己的…...

基于springboot+vue+Mysql的在线答疑系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

ssl证书免费申请指南

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、购买证书二、创建证书三、 验证证书等待出现如下页面&#xff0c;说明申请成功&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6b6c1dd11d4c467687318552da7cdbb2.png) 总结 前言 今天为大…...

Java构造方法详解

在Java方法内部定义一个局部变量时&#xff0c;必须要初始化&#xff0c;否则就会编译失败&#xff0c;如下&#xff1a; 要让上述代码通过编译&#xff0c;只需在使用a之前给a赋一个初始值即可 如果是对象&#xff1a;下面用一个日期类演示 我们没有给年月日赋值&#xff0c;…...

Spring WebFlux:响应式编程

在软件开发领域&#xff0c;随着互联网应用的规模和复杂性不断增加&#xff0c;传统的编程模型逐渐暴露出一些局限性&#xff0c;尤其是在面对高并发、大规模数据流处理等场景时。为了应对这些挑战&#xff0c;响应式编程&#xff08;Reactive Programming&#xff09;应运而生…...

uniapp、web网页跨站数据交互及通讯

来来来&#xff0c;说说你的创作灵感&#xff01;这就跟吃饭睡觉一样&#xff0c;饿了就找吃的&#xff0c;渴了就倒水张口灌。 最近一个多月实在是忙的没再更新日志&#xff0c;好多粉丝私信说之前的创作于他们而言非常有用&#xff01;受益菲浅&#xff0c;这里非常感谢粉丝…...

2024-05-10 Ubuntu上面使用libyuv,用于转换、缩放、旋转和其他操作YUV图像数据,测试实例使用I420ToRGB24

一、简介&#xff1a;libyuv 最初是由Google开发的&#xff0c;主要是为了支持WebRTC项目中的视频处理需求。用于处理YUV格式图像数据的开源库。它提供了一系列的函数&#xff0c;用于转换、缩放、旋转和其他操作YUV图像数据。 二、执行下面的命令下载和安装libyuv。 git clo…...

怎么给视频加水印?2招轻松搞定

在数字媒体时代&#xff0c;视频水印作为一种有效的版权保护手段&#xff0c;被广泛应用于各种场景。给视频添加水印不仅可以防止内容被恶意盗用&#xff0c;还能增加视频的辨识度&#xff0c;提升品牌形象。本文将为您介绍2种简单易行的方法&#xff0c;教您怎么给视频加水印&…...

SpringBootWeb 篇-深入了解请求响应(服务端接收不同类型的请求参数的方式)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 请求响应概述 1.1 简单参数 1.2 实体参数 2.3 数组集合参数 2.4 日期参数 2.5 json 参数 2.6 路径参数 3.0 完整代码 1.0 请求响应概述 当客户端发送不同的请求参…...

实验十 智能手机互联网程序设计(微信程序方向)实验报告

实验目的和要求 完成以下页面设计。 二、实验步骤与结果&#xff08;给出对应的代码或运行结果截图&#xff09; Wxml <view class"container"> <view class"header"> <view class"logo"…...

Python图形复刻——绘制母亲节花束

各位小伙伴&#xff0c;好久不见&#xff0c;今天学习用Python绘制花束。 有一种爱&#xff0c;不求回报&#xff0c;有一种情&#xff0c;无私奉献&#xff0c;这就是母爱。祝天下妈妈节日快乐&#xff0c;幸福永远&#xff01; 图形展示&#xff1a; 代码展示&#xff1a; …...

【算法优选】 动态规划之子数组、子串系列——壹

文章目录 &#x1f38b;前言&#x1f38b;最大子数组和&#x1f6a9;题目描述&#x1f6a9;算法思路&#x1f6a9;代码实现 &#x1f334;环形子数组的最大和&#x1f6a9;题目描述&#x1f6a9;算法思路&#xff1a;&#x1f6a9;代码实现 &#x1f332;乘积最大子数组&#x…...

PXE+Kickstart无人值守安装安装Centos7.9

文章目录 一、什么是PXE1、简介2、工作模式3、工作流程 二、什么是Kickstart1、简介2、触发方式 三、无人值守安装系统工作流程四、实验部署1、环境准备2、服务端&#xff1a;关闭防火墙和selinux3、添加一张仅主机的网卡4、配置仅主机的网卡4.1、修改网络连接名4.2、配IP地址4…...

C语言实现通讯录,包括增删改查以及动态开辟内存,写入文件等功能

文章目录 前言一、注意二、源码1. test.c源文件2. contact.h头文件3. contact.c源文件 总结 前言 C语言实现通讯录&#xff0c;包括增删改查以及动态开辟内存&#xff0c;写入文件等功能 一、注意 在通讯录菜单栏使用枚举定义PeoInfo类型时&#xff0c;每个结构体类型的成员…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...