现代 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 题解 很基础的题目,输入字符串,用计数器去统计一下就好了。 因为赢的次数一样的时候优先判断前面的那个人赢,所以说两个人赢的次数相同的时候我们不必 去记录胜者。 #include<…...
jQuery的选择器与自带函数详解
在前端开发中,jQuery是一个广泛使用的JavaScript库,它极大地简化了HTML文档遍历、事件处理、动画以及AJAX交互等操作。本文将通过一个示例页面,详细介绍jQuery的选择器和一些常用的自带函数。 示例代码优化 首先,我们来优化和完…...
Next.js与SSR:构建高性能服务器渲染应用
1. 创建项目 通过create-next-app脚手架创建一个新的Next.js项目: npx create-next-app my-app cd my-app2. 自动SSR 在Next.js中,每个.js或.jsx文件的组件都会被自动处理为SSR页面。例如,创建一个pages/index.js文件: // pag…...

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

基于springboot+vue+Mysql的在线答疑系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...

ssl证书免费申请指南
同学们可以私信我加入学习群! 正文开始 前言一、购买证书二、创建证书三、 验证证书等待出现如下页面,说明申请成功:  总结 前言 今天为大…...

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

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

uniapp、web网页跨站数据交互及通讯
来来来,说说你的创作灵感!这就跟吃饭睡觉一样,饿了就找吃的,渴了就倒水张口灌。 最近一个多月实在是忙的没再更新日志,好多粉丝私信说之前的创作于他们而言非常有用!受益菲浅,这里非常感谢粉丝…...

2024-05-10 Ubuntu上面使用libyuv,用于转换、缩放、旋转和其他操作YUV图像数据,测试实例使用I420ToRGB24
一、简介:libyuv 最初是由Google开发的,主要是为了支持WebRTC项目中的视频处理需求。用于处理YUV格式图像数据的开源库。它提供了一系列的函数,用于转换、缩放、旋转和其他操作YUV图像数据。 二、执行下面的命令下载和安装libyuv。 git clo…...
怎么给视频加水印?2招轻松搞定
在数字媒体时代,视频水印作为一种有效的版权保护手段,被广泛应用于各种场景。给视频添加水印不仅可以防止内容被恶意盗用,还能增加视频的辨识度,提升品牌形象。本文将为您介绍2种简单易行的方法,教您怎么给视频加水印&…...

SpringBootWeb 篇-深入了解请求响应(服务端接收不同类型的请求参数的方式)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 请求响应概述 1.1 简单参数 1.2 实体参数 2.3 数组集合参数 2.4 日期参数 2.5 json 参数 2.6 路径参数 3.0 完整代码 1.0 请求响应概述 当客户端发送不同的请求参…...

实验十 智能手机互联网程序设计(微信程序方向)实验报告
实验目的和要求 完成以下页面设计。 二、实验步骤与结果(给出对应的代码或运行结果截图) Wxml <view class"container"> <view class"header"> <view class"logo"…...

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

【算法优选】 动态规划之子数组、子串系列——壹
文章目录 🎋前言🎋最大子数组和🚩题目描述🚩算法思路🚩代码实现 🌴环形子数组的最大和🚩题目描述🚩算法思路:🚩代码实现 🌲乘积最大子数组&#x…...

PXE+Kickstart无人值守安装安装Centos7.9
文章目录 一、什么是PXE1、简介2、工作模式3、工作流程 二、什么是Kickstart1、简介2、触发方式 三、无人值守安装系统工作流程四、实验部署1、环境准备2、服务端:关闭防火墙和selinux3、添加一张仅主机的网卡4、配置仅主机的网卡4.1、修改网络连接名4.2、配IP地址4…...
C语言实现通讯录,包括增删改查以及动态开辟内存,写入文件等功能
文章目录 前言一、注意二、源码1. test.c源文件2. contact.h头文件3. contact.c源文件 总结 前言 C语言实现通讯录,包括增删改查以及动态开辟内存,写入文件等功能 一、注意 在通讯录菜单栏使用枚举定义PeoInfo类型时,每个结构体类型的成员…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...