编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • C语言入门精通

  • Cpp入门到精通

    • README
    • 入门教程

      • README
      • Cpp简史
      • 基础语法
      • 数据类型
      • 运算符
      • 复合类型
      • 流程语句
      • 函数
      • 指针引用
      • 类和对象
      • 继承多态
      • 内存模型
      • 动态内存
      • IO和文件
      • 异常处理
      • 线程和锁
      • STL模版
      • 预处理器
      • 特性图谱
        • 目录介绍
        • 01.特性矩阵阅读说明
          • 1.1 三个评分维度
          • 1.2 颜色与符号约定
        • 02.C++11 重要特性(共 22 项)
        • 03.C++14 重要特性(共 9 项)
        • 04.C++17 重要特性(共 18 项)
        • 05.C++20 重要特性(共 22 项)
          • 四大支柱
          • 其他重要特性
        • 06.C++23 重要特性(共 12 项)
        • 07.特性相互依赖图
        • 08.按使用场景索引
          • 8.1 写函数 / 类时常用
          • 8.2 容器与算法相关
          • 8.3 错误处理相关
          • 8.4 元编程 / 编译期相关
          • 8.5 并发相关
        • 09.学习优先级建议
        • 10.本章新手陷阱 Top 5
          • 陷阱 1:以为"我会 C++17 = 我会现代 C++"
          • 陷阱 2:把 C++20 写出 C++03 的样子
          • 陷阱 3:用了智能指针仍然写出循环引用
          • 陷阱 4:在头文件用 std::optional 但忘记 <optional>
          • 陷阱 5:以为 auto 永远是好事
        • 11.思考题
    • 综合案例

    • 专栏博客

    • 开发技巧

  • Java入门精通

  • Go入门到精通

  • JavaScript入门

  • CodeX
  • Cpp入门到精通
  • 入门教程
杨充
2026-05-07
目录

特性图谱

# 第 18 章 C++ 关键特性速览

本章定位:全卷收尾 + 后续三卷的索引。 把 C++11/14/17/20/23 的所有重要特性按"使用频度 × 重要性"两个维度排序,每条特性给一句话评注 + 一个最小示例 + 在哪一卷哪一章展开学习。 读完这一章你将拥有一张"现代 C++ 全景图",遇到陌生特性能立刻定位它在哪一代、能不能用、值不值得现在学。


# 目录介绍

  • 01.特性矩阵阅读说明
    • 1.1 三个评分维度
    • 1.2 颜色与符号约定
  • 02.C++11 重要特性(共 22 项)
  • 03.C++14 重要特性(共 9 项)
  • 04.C++17 重要特性(共 18 项)
  • 05.C++20 重要特性(共 22 项)
  • 06.C++23 重要特性(共 12 项)
  • 07.特性相互依赖图
  • 08.按使用场景索引
    • 8.1 写函数 / 类时常用
    • 8.2 容器与算法相关
    • 8.3 错误处理相关
    • 8.4 元编程 / 编译期相关
    • 8.5 并发相关
  • 09.学习优先级建议
  • 10.本章新手陷阱 Top 5
  • 11.思考题
  • 12.推荐阅读

# 01.特性矩阵阅读说明

# 1.1 三个评分维度

每条特性都按以下三个维度打分:

维度 含义 取值
频度 工业界代码出现频率 ⭐⭐⭐⭐⭐ 极高 / ⭐⭐⭐⭐ 高 / ⭐⭐⭐ 中 / ⭐⭐ 低 / ⭐ 罕见
重要 错过后影响严重程度 ⭐⭐⭐⭐⭐ 必学 / ⭐⭐⭐⭐ 强烈推荐 / ⭐⭐⭐ 应知道 / ⭐⭐ 可选 / ⭐ 边缘
难度 上手成本 🟢 简单 / 🟡 中等 / 🔴 困难

# 1.2 颜色与符号约定

  • 🆕 表示该版本新增
  • 🔧 表示该版本对前版本已有特性的"修补"
  • 📚 表示在哪一卷哪一章展开
  • ⚡ 表示性能 / 安全 / 工程化角度的重要意义

# 02.C++11 重要特性(共 22 项)

# 特性 频度 重要 难度 一句话评注 卷&章
1 auto 类型推导 🆕 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟢 告别 std::vector<...>::iterator 的冗长 卷一第 3、8 章
2 nullptr 🆕 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟢 修复 NULL 在重载/模板的歧义 卷一第 8 章
3 范围 for 🆕 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟢 for (const auto& x : vec) 卷一第 6 章
4 Lambda 表达式 🆕 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟡 让函数式编程进入 C++ 卷一第 7 章;卷三第 12 章
5 右值引用 + 移动语义 🆕 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🔴 后续一切高性能 C++ 的基石 卷三第 11 章
6 智能指针 unique_ptr/shared_ptr/weak_ptr 🆕 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟡 RAII 标配化 卷一第 12 章;卷三第 10 章
7 统一初始化 {} 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟡 防止窄化转换 卷一第 3、9 章
8 std::thread / mutex / atomic 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🔴 多线程进入标准库 卷一第 15 章;卷三第 16-17 章
9 enum class 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟢 强类型枚举 卷一第 5 章
10 constexpr(函数 + 变量) 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟡 编译期计算入门 卷一第 7 章;卷三第 18 章
11 override / final 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟢 让多态写错有编译期保护 卷一第 10 章
12 =default / =delete 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟢 显式控制特殊成员函数 卷一第 9 章
13 委托构造 / 继承构造 🆕 ⭐⭐⭐ ⭐⭐⭐ 🟡 减少构造函数重复代码 卷一第 9 章
14 变长模板(Variadic Templates) 🆕 ⭐⭐⭐ ⭐⭐⭐⭐ 🔴 模板可接收任意数量参数 卷三第 6 章
15 using 类型别名(含模板别名) 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟢 替代 typedef 卷一第 3 章
16 decltype 🆕 ⭐⭐⭐ ⭐⭐⭐ 🟡 推导表达式类型,常配 auto 用 卷一第 3 章;卷三第 14 章
17 尾置返回类型 auto f(int) -> int 🆕 ⭐⭐ ⭐⭐⭐ 🟡 模板里写复杂返回类型时必须 卷一第 7 章
18 强类型 noexcept 🆕 ⭐⭐⭐ ⭐⭐⭐⭐ 🟡 替代过时的 throw() 卷一第 14 章
19 std::function / std::bind 🆕 ⭐⭐⭐ ⭐⭐⭐ 🟡 泛型可调用对象 卷一第 7 章;卷三第 12 章
20 std::tuple / std::array 🆕 ⭐⭐⭐ ⭐⭐⭐ 🟢 标准化的固定大小聚合 卷一第 5 章
21 std::chrono 🆕 ⭐⭐⭐ ⭐⭐⭐⭐ 🟡 强类型时间库(不再传 int 表示秒) 卷三第 17 章
22 原始字符串 R"(...)" 🆕 ⭐⭐ ⭐⭐⭐ 🟢 写正则 / SQL 不用反斜杠 卷一第 5 章

示例:移动语义最小代码

std::string a = "hello";
std::string b = std::move(a);  // 把 a 的内部缓冲"移给" b,避免拷贝
// 此时 a 处于"已被移动"状态,可析构、可重新赋值,不可读
1
2
3

# 03.C++14 重要特性(共 9 项)

C++14 是 C++11 的修补版——大多数特性是补 C++11 的"漏写"。

# 特性 频度 重要 难度 评注 卷&章
1 std::make_unique<T>(...) 🔧 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟢 C++11 漏写了,C++14 补上 卷一第 12 章
2 函数返回类型推导 auto f() { return 1; } 🔧 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟢 C++11 只能尾置 卷一第 7 章
3 泛型 Lambda [](auto x){...} 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟡 Lambda 也能写模板 卷一第 7 章;卷三第 12 章
4 constexpr 大幅放宽 🔧 ⭐⭐⭐ ⭐⭐⭐⭐ 🟡 函数体内允许 if/while/局部变量 卷三第 18 章
5 二进制字面量 0b1010 🆕 ⭐⭐ ⭐⭐ 🟢 位操作更直观 卷一第 4 章
6 数字分隔符 1'000'000 🆕 ⭐⭐⭐ ⭐⭐⭐ 🟢 大数字可读性 卷一第 3 章
7 std::shared_timed_mutex 🆕 ⭐⭐ ⭐⭐ 🟡 读写锁标准化(C++17 又改了) 卷一第 15 章;卷三第 17 章
8 变量模板 template<class T> constexpr T pi = ... 🆕 ⭐⭐ ⭐⭐⭐ 🟡 让常量也能模板化 卷三第 6 章
9 [[deprecated]] 属性 🆕 ⭐⭐⭐ ⭐⭐⭐ 🟢 标记弃用 API 编译时警告 卷一第 7 章

# 04.C++17 重要特性(共 18 项)

对工程师最舒适的一次升级。 本书的"基线"。

# 特性 频度 重要 难度 评注 卷&章
1 结构化绑定 auto [a,b] = pair; 🆕 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟢 拆 pair/tuple/struct 不再痛苦 卷一第 6 章
2 if/switch 初始化 if (auto v = f(); v > 0) 🆕 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟢 限定作用域、消除变量污染 卷一第 6 章
3 if constexpr 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟡 模板里的"编译期分支",源码可读 卷一第 6 章;卷三第 6 章
4 std::optional<T> 🆕 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟢 "可能没有值"的标准表达 卷一第 3、14 章
5 std::variant<T1,T2,...> 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟡 类型安全的 union 卷一第 3 章
6 std::string_view 🆕 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟡 零拷贝字符串视图,函数参数首选 卷一第 5 章
7 std::filesystem 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟢 跨平台文件系统操作 卷一第 13 章
8 折叠表达式 (args + ...) 🆕 ⭐⭐⭐ ⭐⭐⭐⭐ 🟡 变长模板写起来不再恐怖 卷三第 6 章
9 嵌套命名空间 namespace a::b::c {} 🆕 ⭐⭐⭐⭐ ⭐⭐⭐ 🟢 一行解决三层命名空间 卷一第 2 章
10 拷贝省略(保证的 RVO) 🔧 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟢 返回值不再拷贝(语言层面保证) 卷三第 11 章
11 std::any 🆕 ⭐⭐ ⭐⭐⭐ 🟡 类型擦除的容器 卷一第 3 章
12 内联变量 inline int g_x = 1; 🆕 ⭐⭐⭐ ⭐⭐⭐⭐ 🟢 头文件中定义全局变量不再链接错 卷一第 17 章
13 [[nodiscard]] 属性 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟢 强制调用者使用返回值 卷一第 7 章
14 [[fallthrough]] 属性 🆕 ⭐⭐⭐ ⭐⭐⭐ 🟢 显式标记 switch 穿透 卷一第 6 章
15 [[maybe_unused]] 属性 🆕 ⭐⭐⭐ ⭐⭐⭐ 🟢 抑制"未使用"警告 卷一第 7 章
16 并行算法 std::execution::par 🆕 ⭐⭐ ⭐⭐⭐ 🟡 STL 算法一行加并行 卷一第 16 章;卷三第 8 章
17 std::byte 🆕 ⭐⭐⭐ ⭐⭐⭐⭐ 🟢 表示原始字节,比 unsigned char 语义清晰 卷一第 3 章
18 类模板参数推导 (CTAD) std::vector v{1,2,3}; 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟡 不用写模板参数 卷一第 16 章;卷三第 6 章

示例:C++17 让代码瞬间舒服

#include <map>
#include <string>
#include <iostream>
#include <optional>

std::optional<int> find_score(const std::map<std::string, int>& m, const std::string& name) {
    if (auto it = m.find(name); it != m.end()) {  // ① if-init + ② structured bindings
        auto& [key, val] = *it;
        return val;
    }
    return std::nullopt;
}

int main() {
    std::map<std::string, int> scores{{"Alice", 90}, {"Bob", 85}};
    if (auto s = find_score(scores, "Alice"); s) {
        std::cout << "Alice: " << *s << "\n";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 05.C++20 重要特性(共 22 项)

深度堪比 C++11。

# 四大支柱

# 特性 频度 重要 难度 评注 卷&章
1 Concepts 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🔴 模板报错从 1000 行降到 5 行 卷三第 9 章
2 Ranges 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🔴 STL 链式调用,告别迭代器对 卷三第 9 章
3 Modules 🆕 ⭐⭐ ⭐⭐⭐⭐⭐ 🔴 #include 终于有替代,编译时间大降 卷三第 21 章
4 Coroutines 🆕 ⭐⭐ ⭐⭐⭐⭐⭐ 🔴 异步代码同步写法 卷三第 19 章

# 其他重要特性

# 特性 频度 重要 难度 评注 卷&章
5 太空船 <=> 🆕 ⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟡 一个运算符代替 6 个比较 卷一第 4 章
6 std::format 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟢 Python 风格格式化 卷一第 13 章
7 std::span<T> 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟡 数组的"非拥有视图" 卷一第 5、8 章
8 consteval 🆕 ⭐⭐ ⭐⭐⭐⭐ 🟡 强制编译期函数 卷一第 7 章
9 constinit 🆕 ⭐⭐ ⭐⭐⭐ 🟡 强制编译期初始化 卷三第 18 章
10 requires 子句 🆕 ⭐⭐⭐ ⭐⭐⭐⭐ 🔴 Concepts 的语法表达 卷三第 9 章
11 缩写函数模板 void f(auto x) 🆕 ⭐⭐⭐ ⭐⭐⭐ 🟢 模板可像普通函数写 卷三第 6 章
12 [[likely]] / [[unlikely]] 🆕 ⭐⭐ ⭐⭐⭐ 🟢 分支预测提示 卷四第 9 章
13 std::source_location 🆕 ⭐⭐⭐ ⭐⭐⭐⭐ 🟢 编译期获取文件/行号 卷一第 17 章
14 std::jthread 🆕 ⭐⭐⭐ ⭐⭐⭐⭐ 🟢 自动 join 的 thread 卷一第 15 章
15 std::stop_token / stop_source 🆕 ⭐⭐ ⭐⭐⭐ 🟡 协作式取消 卷一第 15 章;卷三第 17 章
16 std::atomic_ref 🆕 ⭐⭐ ⭐⭐⭐ 🔴 对非原子变量的原子操作 卷三第 16 章
17 指定初始化 Foo{ .x = 1, .y = 2 } 🆕 ⭐⭐⭐ ⭐⭐⭐ 🟢 C 风格指定字段初始化 卷一第 5 章
18 std::erase / std::erase_if 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟢 替代 erase-remove 习语 卷一第 16 章;卷三第 8 章
19 字符串字面量类模板参数 🆕 ⭐ ⭐⭐ 🔴 编译期字符串元编程 卷三第 6 章
20 范围 for 支持初始化 🆕 ⭐⭐⭐ ⭐⭐⭐ 🟢 for (auto v = expr(); auto& x : v) 卷一第 6 章
21 三元运算符返回左值(小修) 🔧 ⭐⭐ ⭐⭐ 🟡 表达式可以左值 卷一第 4 章
22 using enum 🆕 ⭐⭐ ⭐⭐⭐ 🟢 把 enum class 成员引入作用域 卷一第 5 章

示例:Concepts + Ranges 组合

#include <ranges>
#include <vector>
#include <iostream>

template<typename T>
concept Numeric = std::integral<T> || std::floating_point<T>;

template<Numeric T>
auto square(T x) { return x * x; }

int main() {
    std::vector v{1, 2, 3, 4, 5};
    for (auto x : v | std::views::filter([](int n){ return n % 2; })
                    | std::views::transform([](int n){ return square(n); })) {
        std::cout << x << " ";   // 1 9 25
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 06.C++23 重要特性(共 12 项)

# 特性 频度 重要 难度 评注 卷&章
1 std::expected<T, E> 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 🟡 比异常更轻量的错误处理 卷一第 14 章
2 std::print / std::println 🆕 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 🟢 终于不用 << endl 卷一第 13 章
3 if consteval 🆕 ⭐⭐ ⭐⭐⭐ 🟡 区分编译期/运行期上下文 卷三第 18 章
4 deducing this("显式对象参数") 🆕 ⭐⭐ ⭐⭐⭐⭐ 🔴 成员函数与 Lambda 统一 卷三第 6 章
5 多维下标 arr[i, j] 🆕 ⭐⭐ ⭐⭐⭐ 🟢 矩阵操作更自然 卷一第 5 章
6 std::flat_map / flat_set 🆕 ⭐⭐ ⭐⭐⭐ 🟢 缓存友好的有序容器 卷三第 7 章
7 std::mdspan 🆕 ⭐⭐ ⭐⭐⭐⭐ 🟡 多维数组视图(HPC) 卷三第 7 章
8 std::generator 🆕 ⭐⭐ ⭐⭐⭐ 🔴 协程的最简形式 卷三第 19 章
9 std::stacktrace 🆕 ⭐⭐⭐ ⭐⭐⭐⭐ 🟢 标准库内置栈追踪 卷四第 1-2 章
10 std::byteswap / unreachable 🆕 ⭐⭐ ⭐⭐⭐ 🟢 工具函数 卷三第 14 章
11 import std; 🆕 ⭐ ⭐⭐⭐⭐ 🟡 Modules 的标准库形式 卷一第 17 章;卷三第 21 章
12 字符串字面量 s / sv 后缀(小修) 🔧 ⭐⭐⭐ ⭐⭐⭐ 🟢 "hello"sv → string_view 卷一第 5 章

示例:std::expected 替代异常

#include <expected>
#include <string>

std::expected<int, std::string> parse_int(const std::string& s) {
    try {
        return std::stoi(s);
    } catch (...) {
        return std::unexpected("invalid number: " + s);
    }
}

int main() {
    auto r = parse_int("abc");
    if (r) std::println("got {}", *r);
    else   std::println("error: {}", r.error());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 07.特性相互依赖图

                  ┌──────────────────────────┐
                  │      C++11 基础特性       │
                  │  auto / lambda / move /  │
                  │  smart_ptr / variadic    │
                  └─────────────┬────────────┘
                                │
                ┌───────────────┼───────────────┐
                │               │               │
      ┌─────────▼─────┐ ┌──────▼──────┐ ┌──────▼──────┐
      │ C++14 修补     │ │ 模板元编程   │ │ 并发原语     │
      │ make_unique    │ │ Variadic     │ │ thread/mutex│
      │ generic lambda│ │ constexpr    │ │ atomic       │
      └─────┬──────────┘ └──────┬──────┘ └──────┬──────┘
            │                    │                │
      ┌─────▼─────────┐         │                │
      │ C++17 实用      │         │                │
      │ optional/      │         │                │
      │ string_view/   │         │                │
      │ filesystem/    │         │                │
      │ if-init/       │         │                │
      │ structured     │         │                │
      │ bindings       │         │                │
      └─────┬──────────┘         │                │
            │                    │                │
            └────────┬───────────┴────────────────┘
                     │
              ┌──────▼──────────────────┐
              │ C++20 革命              │
              │ Concepts ←── Templates  │
              │ Ranges   ←── Concepts   │
              │ Coroutines              │
              │ Modules                 │
              │ <=>                     │
              └──────┬──────────────────┘
                     │
              ┌──────▼──────────────────┐
              │ C++23 完善              │
              │ expected                │
              │ stacktrace              │
              │ generator               │
              │ deducing this           │
              └─────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

# 08.按使用场景索引

# 8.1 写函数 / 类时常用

想做什么 用哪个 哪一代
函数参数类型自动推导 auto C++14
限制模板参数的类型 Concepts C++20
强制调用者用返回值 [[nodiscard]] C++17
函数永远不抛 noexcept C++11
表达"可能失败" std::optional<T> C++17
表达"成功值或错误" std::expected<T,E> C++23
默认全部生成比较运算符 auto operator<=>(...) = default; C++20
显式禁用拷贝 =delete C++11

# 8.2 容器与算法相关

想做什么 用哪个 哪一代
字符串作为函数参数 std::string_view C++17
数组作为函数参数 std::span<T> C++20
链式 STL 算法 Ranges + views C++20
并行 STL 算法 std::execution::par C++17
删除满足条件的元素 std::erase_if C++20
替代裸数组 std::array<T, N> C++11
多维数组视图 std::mdspan C++23
缓存友好的 map std::flat_map C++23

# 8.3 错误处理相关

想做什么 用哪个 哪一代
抛异常 throw C++98
标记不抛异常 noexcept C++11
不用异常表达失败 std::expected<T,E> C++23
获取栈追踪 std::stacktrace C++23
获取源码位置 std::source_location C++20

# 8.4 元编程 / 编译期相关

想做什么 用哪个 哪一代
编译期函数 constexpr C++11/14/17/20
强制编译期函数 consteval C++20
强制编译期初始化 constinit C++20
运行/编译期分支 if constexpr / if consteval C++17 / C++23
类型谓词 Concepts C++20

# 8.5 并发相关

想做什么 用哪个 哪一代
创建线程 std::thread / std::jthread C++11 / C++20
互斥锁 std::mutex + std::scoped_lock C++11 / C++17
原子操作 std::atomic<T> C++11
协程 co_await / co_yield / co_return C++20
协作式取消 std::stop_token C++20
生成器 std::generator<T> C++23

# 09.学习优先级建议

把上面 80+ 个特性拆成 三个梯队:

┌──────────────────────────────────────────────────────────────┐
│ 第一梯队(必学,3 个月内掌握)                                │
│   auto / nullptr / 范围 for / lambda / smart_ptr /           │
│   move semantics / structured bindings / if-init /           │
│   string_view / optional / filesystem / format /             │
│   override/final / =default/=delete                          │
├──────────────────────────────────────────────────────────────┤
│ 第二梯队(强烈推荐,6 个月内掌握)                             │
│   Concepts / Ranges / span / variant / constexpr 进阶 /      │
│   <=> / [[nodiscard]] / make_unique / chrono /               │
│   thread / mutex / atomic / std::format                      │
├──────────────────────────────────────────────────────────────┤
│ 第三梯队(按需学习)                                          │
│   Coroutines / Modules / expected / mdspan /                 │
│   deducing this / pmr / 模板元编程深挖                        │
└──────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

对零基础读者的建议路径:

  1. 卷一全部读完后,只确保第一梯队里每条都能写出最小示例
  2. 进入卷二做项目时强制使用第一梯队(哪怕代码看起来像 C++11 也比 C++03 强)
  3. 进卷三才碰第二梯队
  4. 卷四 + 自己实战遇到具体场景再啃第三梯队

# 10.本章新手陷阱 Top 5

# 陷阱 1:以为"我会 C++17 = 我会现代 C++"

C++17 只是基线。面试时被问 Concepts / Ranges / 协程,说"我没用过"会显得停滞——至少要能说出"它解决了什么问题"。

# 陷阱 2:把 C++20 写出 C++03 的样子

// ❌ 形似 C++03
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
    if (*it > 0) std::cout << *it;
}

// ✅ C++20
for (auto x : v | std::views::filter([](int n){ return n > 0; })) {
    std::cout << x;
}
1
2
3
4
5
6
7
8
9

# 陷阱 3:用了智能指针仍然写出循环引用

struct Node {
    std::shared_ptr<Node> next;
    std::shared_ptr<Node> prev;   // ❌ 循环引用,永不释放
};
1
2
3
4

正解:其中一方用 std::weak_ptr。

# 陷阱 4:在头文件用 std::optional 但忘记 <optional>

C++17 大量新类型分散在不同头文件,用什么类型就 include 什么头文件。

# 陷阱 5:以为 auto 永远是好事

auto x = vec.size();   // x 是 size_t(无符号)
if (x - 5 < 0)         // ❌ 永远 false(无符号溢出)
1
2

# 11.思考题

  1. C++11 中你认为最重要的 5 个特性是什么?为什么?
  2. 假设你在一个仍用 C++11 的代码库工作,要补哪 3 个 Boost 特性可以"接近 C++17"?
  3. 写一段代码,只用 C++17,实现"读文件、按行解析整数、过滤大于 0 的、求和"。
  4. 把上题用 C++20 Ranges 重写,对比可读性差异。
  5. std::expected<T, E> 与抛异常相比,分别在什么场景占优?
  6. 为什么 std::optional 在表达"可能没有值"时比"用 nullptr 哨兵"更好?
  7. auto operator<=>(const Foo&) const = default; 究竟生成了几个运算符?
  8. 给一段 C++11 代码——把局部变量类型推导从 std::vector<int>::const_iterator 改成 auto,编译器还能正常推断吗?什么时候不能?
  9. 为什么协程被认为"难"?它的难点究竟在语法、还是在配套库?
  10. 假如让你今天给团队做 C++ 升级方案:从 C++11 → ?,理由是什么?

全卷收官:

你已经看完卷一 18 章。把它当作地基——下一步进入卷二开始写真实项目,到那时你会感谢自己已经把地基打牢了。

➡ 进入卷二《工程卷:面向对象与项目实战》,先看 02.综合案例/00.卷二总目录与导读.md(计划在卷二启动时创建)

上次更新: 2026/06/10, 11:13:41
预处理器
README

← 预处理器 README→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式