现代 C++ 新特性汇总:从 C++11 到 C++23
从 C++11 开始,标准每三年发布一个版本,到 C++23 已有五个主要版本,累计引入上百个语言与标准库特性。本文是一张总览地图:每个版本的定位、代表特性与编译器支持入口,帮助快速建立全貌;各版本的详细说明与代码示例见系列分篇。
版本演进一览
| 版本 | 定位 | 代表特性 |
|---|---|---|
| C++11 | major,现代 C++ 起点 | 内存模型、auto、lambda、智能指针、变参模板 |
| C++14 | minor,给 C++11 打补丁 | 泛型 lambda、make_unique、放松 constexpr |
| C++17 | 「中」版本 | 结构化绑定、if constexpr、CTAD、string_view/optional/variant |
| C++20 | major | 模块、概念、协程、范围(The Big Four) |
| C++23 | minor,含金量不低 | expected、print、generator、flat 容器、推导 this |
各版本特性清单参照《A Tour of C++》附录的框架整理,并按标准原文核对归类。
C++11:现代 C++ 的起点
详细内容见 C++11 新特性。
新的语言特性:
- 内存模型——为现代硬件设计的底层抽象,是描述并发行为的基础
- auto 和 decltype——避免类型名称的不必要重复
- 右值引用与移动语义——
std::move标记可移动,资源窃取代替深拷贝 - 统一初始化——对所有类型(几乎)完全一致的初始化语法
- nullptr——给空指针一个专有名字
- constexpr 函数——在编译期求值的函数
- 用户定义字面量——为自定义类型提供字面量支持
- lambda 表达式——匿名函数对象
- 变参模板——处理任意个任意类型参数的模板
- 模板别名——重命名模板并绑定部分模板参数
- noexcept——明确承诺函数不抛异常
- override 和 final——管理大型类层次结构的明确语法
- static_assert——编译期断言
- long long——至少 64 位的整数类型
- 默认成员初始化器——数据成员的默认值
- enum class——带作用域的强类型枚举
新的标准库特性:
- unique_ptr 和 shared_ptr——依赖 RAII 的资源管理指针
- 内存模型和 atomic 变量
- thread、mutex、condition_variable 等——系统层级并发的类型安全封装
- future、promise 和 packaged_task 等——一次性结果传递
- tuple——匿名的简单复合类型
- 类型特征(type trait)——元编程的基础构件
- 正则表达式匹配
- 随机数——引擎与分布分离的新框架
- 时间——time_point 和 duration
- unordered_map 等——哈希表
- array——知道自己大小的定长数组
- emplace 运算——容器内直接构造对象
- exception_ptr——跨线程传递异常
C++14:minor 版本
主要在给 C++11 打补丁,让使用更方便、对新手更友好。详细内容见 C++14 新特性。
新的语言特性:
- 泛型的 lambda
- lambda 捕获部分中使用表达式(初始化捕获)
- 函数返回类型推导
- 另一种类型推断:decltype(auto)
- 放松的 constexpr 函数限制
- 变量模板
- 聚合类成员初始化
- 二进制字面量:0b 或 0B 前缀
- 数字分位符
- deprecated 属性
新的标准库特性:
- 共享的互斥体和锁:std::shared_timed_mutex
- 元函数的别名(_t 后缀一族)
- 关联容器中的异构查找
- 标准自定义字面量(""s、""h 等)
- 通过类型寻址多元组
- std::make_unique、std::is_final 等较小特性
C++17:「中」版本
本应是一个 major 版本,最终收敛为中等规模的更新。详细内容见 C++17 新特性。
新的语言特性:
- 保证拷贝省略
- 按值捕获 *this(P0018R3)
- 超对齐类型的动态分配
- 严格指定运算顺序
- UTF-8 字符字面量(u8'a')
- 十六进制浮点字面量
- 折叠表达式
- 泛型值模板参数(auto 模板参数)
- 类模板参数的类型推导(CTAD)
- 编译时 if(if constexpr)
- 带有初始值设定项的选择语句
- constexpr 匿名函数
- inline 变量
- 结构化绑定
- 新的标准属性:[[maybe_unused]]、[[nodiscard]] 和 [[fallthrough]]
- 用底层类型的值来初始化 enum 类型
- 嵌套命名空间定义等小的扩展
新的标准库特性:
- 文件系统(<filesystem>)
- 并行算法
- 数学特殊函数
- string_view
- std::byte(<cstddef>,库特性而非语言特性,常被误归入语言侧)
- any
- variant
- optional
- invoke()
- to_chars() 和 from_chars()
- 多态分配器(pmr)
- scoped_lock
- shared_mutex 等小的扩展
C++20:major 版本
四个最重要的特性是 "The Big Four":模块、概念、协程、范围。详细内容见 C++20 新特性。
新的语言特性:
- 模块
- 概念
- 协程
- 可指定的初始值设定项(C99 功能的略微受限版本)
- <=>(三向比较操作符)
- 标准属性 [[no_unique_address]]、[[likely]] 和 [[unlikely]]
- constexpr 函数中允许更多功能:new、union、try-catch、dynamic_cast 和 typeid
- 保证编译时求值的 consteval 函数
- 保证静态初始化的 constinit 变量
- using 可用于带作用域的 enum
- char8_t、lambda 模板参数等小的扩展
新的标准库特性:
- 范围、视图和管道
- printf() 风格的格式化:format() 和 vformat()
- 日历和时区
- span
- source_location
- 数学常数(<numbers>:pi、e、ln10 等)
- 对 atomic 的许多扩展(原子浮点、wait/notify、atomic_ref)
- barrier 和 latch
- 特性测试宏
- bit_cast<>
- 位操作(popcount 等)
- 更多的标准库函数成为 constexpr
- 标准库中更多地使用 <=> 操作符
- jthread、semaphore、midpoint、lerp、starts_with/ends_with 等小的扩展
C++23:minor 版本,含金量不低
详细内容见 C++23 新特性。
新的语言特性:
- 显式对象形参(推导 this)
- if consteval / if not consteval
- 多维下标运算符
- static operator() 和 static operator[]
- auto(x):语言中的衰退复制
- lambda 表达式上的属性
- 可选的扩展浮点类型:std::float{16|32|64|128}_t 和 std::bfloat16_t
- std::size_t 字面量后缀 uz / z
- #elifdef、#elifndef 与 #warning
- 通过新属性 [[assume(表达式)]] 进行假设
- 具名通用字符转义、可移植源文件编码为 UTF-8、行拼合之前修剪空白
- 新语言功能特性测试宏
新的标准库特性:
- 新的词汇类型 std::expected
- std::print / std::println
- std::generator
- 「平铺」容器适配器:std::flat_map、std::flat_set 等
- std::mdspan
- std::optional 的单子式操作:or_else、and_then、transform
- 栈踪迹(stacktrace)库
- 新的范围折叠算法与范围适配器(enumerate、zip、chunk、slide 等)、ranges::to
- std::move_only_function
- std::spanstream
- std::byteswap、std::to_underlying
- string/string_view 的 contains、resize_and_overwrite
- 禁止从 nullptr 构造 string_view
- 关联容器的异质擦除等
C++26 展望
C++26 已于 2025 年中完成特性冻结与委员会审定(2025 年 6 月索菲亚会议通过),正式文本预计 2026 年内发布。三个方向最值得关注:反射(P2996,编译期类型检查与生成)、契约(P2900,语言级前置/后置条件与断言)、std::execution(P2300,senders/receivers 并发框架)。编译器支持进度见 Compiler support for C++26。
编译器支持情况
- C++11:Compiler support for C++11
- C++14:Compiler support for C++14
- C++17:Compiler support for C++17
- C++20:Compiler support for C++20
- C++23:Compiler support for C++23
- C++26:Compiler support for C++26
要点
- 选版本不必求新:GCC/Clang 对 C++17 的支持已经完备,C++20 的模块与协程在工具链层面仍需验证;新特性的可用性优先按特性测试宏判断,而不是按编译器版本号
- C++11 与 C++17 是投入产出比最高的两档:前者奠定现代写法,后者的词汇类型与 if constexpr 直接改变日常代码风格
- C++20/23 的新框架(协程、范围)在后续版本持续补库工具,选型时把「标准库配套是否齐全」纳入考量