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

antsmallant 2024-10-21 14:35:02 阅读 65

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

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


1. 新特性


1.1 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)——类型的可测试属性,用于元编程正则表达式匹配随机数——带有许多生成器(引擎)和多种分布时间——<code>time_pointcode> 和 durationunordered_map 等——哈希表forward_list——单向链表array——具有固定常量大小的数组,并且会记住自己的大小emplace 运算——在容器内直接构建对象,避免拷贝exception_ptr——允许在线程之间传递异常


1.2 c++14 新特性

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

新的语言特性[2]:

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

新的标准库特性[2]:

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


1.3 c++17 新特性

c++17 是一个 “中” 版本(它本来应该是一个 major 版本)。

新的语言特性[3]:

保证拷贝省略。超对齐类型的动态分配。严格指定运算顺序。UTF-8 字面量。十六进制浮点字面量。折叠表达式。泛型值模板参数(auto模板参数)。类模板参数的类型推导。编译时 if。带有初始值设定项的选择语句。constexpr 匿名函数。inline 变量。结构化绑定。新的标准属性:[[maybe_unused]]、[[nodiscard]] 和 [[fallthrough]]。std::byte 类型。用底层类型的值来初始化 enum 类型。一些小的扩展。

新的标准库特性[3]:

文件系统。并行算法。数学特殊函数。string_view。any。variant。optional。调用任何可以为给定参数集调用的方法:invoke()。基本字符串转换:to_chars() 和 from_chars()。多态分配器。scoped_lock。一些小的扩展。


1.4 c++20 新特性

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

新的语言特性[3]:

模块概念协程可指定的初始值设定项(C99功能的略微受限版本)<=>(“宇宙飞船操作符”)三向比较操作符[*this]按值捕获当前对象标准属性 [[no_unique address]][[likely]][[unlikely]]在 constexpr 函数中允许使用更多功能,包括 new、union、try-catch、dynamic_cast 和 typeid保证编译时求值的 consteval 函数保证静态(非运行时)初始化的 constinit 变量using 可用于带作用域的 enum还有一些小的扩展

新的标准库特性[3]:

范围、视图和管道printf() 风格的格式化: format()vformat()日历和时区span,用于对连续数组进行读写访问source_location数学常数,例如 pi 和 1n10e对 atomic 的许多扩展等待多个 thread 的方法: barrier 和 latch特性测试宏bit cast<>位操作更多的标准库函数成为 constexpr在标准库中更多地使用 <=> 操作符更多的小扩展


1.5 c++23 新特性

c++23 是一个 minor 版本。

新的语言特性[4]:

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

新的标准库特性[4]:

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


2. 编译器支持情况


2.1 按版本区分

c++11 : Compiler support for C++11c++14 : Compiler support for C++14c++17 : Compiler support for C++17c++20 : C++ compiler supportc++23 : C++ compiler support


2.2 按编译器区分

gcc : C++ Standards Support in GCCclang : C++ Support in Clang汇总 : cpp/compiler support/vendors


3. 参考

[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] [美] Bjarne Stroustrup. C++之旅(第3版). pansz. 北京: 电子工业出版社, 2023-10(1).

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。