特性图谱
# 第 18 章 C++ 关键特性速览
本章定位:全卷收尾 + 后续三卷的索引。 把 C++11/14/17/20/23 的所有重要特性按"使用频度 × 重要性"两个维度排序,每条特性给一句话评注 + 一个最小示例 + 在哪一卷哪一章展开学习。 读完这一章你将拥有一张"现代 C++ 全景图",遇到陌生特性能立刻定位它在哪一代、能不能用、值不值得现在学。
# 目录介绍
- 01.特性矩阵阅读说明
- 02.C++11 重要特性(共 22 项)
- 03.C++14 重要特性(共 9 项)
- 04.C++17 重要特性(共 18 项)
- 05.C++20 重要特性(共 22 项)
- 06.C++23 重要特性(共 12 项)
- 07.特性相互依赖图
- 08.按使用场景索引
- 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
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
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
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
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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
对零基础读者的建议路径:
- 卷一全部读完后,只确保第一梯队里每条都能写出最小示例
- 进入卷二做项目时强制使用第一梯队(哪怕代码看起来像 C++11 也比 C++03 强)
- 进卷三才碰第二梯队
- 卷四 + 自己实战遇到具体场景再啃第三梯队
# 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
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
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
2
# 11.思考题
- C++11 中你认为最重要的 5 个特性是什么?为什么?
- 假设你在一个仍用 C++11 的代码库工作,要补哪 3 个 Boost 特性可以"接近 C++17"?
- 写一段代码,只用 C++17,实现"读文件、按行解析整数、过滤大于 0 的、求和"。
- 把上题用 C++20 Ranges 重写,对比可读性差异。
std::expected<T, E>与抛异常相比,分别在什么场景占优?- 为什么
std::optional在表达"可能没有值"时比"用nullptr哨兵"更好? auto operator<=>(const Foo&) const = default;究竟生成了几个运算符?- 给一段 C++11 代码——把局部变量类型推导从
std::vector<int>::const_iterator改成auto,编译器还能正常推断吗?什么时候不能? - 为什么协程被认为"难"?它的难点究竟在语法、还是在配套库?
- 假如让你今天给团队做 C++ 升级方案:从 C++11 → ?,理由是什么?
全卷收官:
你已经看完卷一 18 章。把它当作地基——下一步进入卷二开始写真实项目,到那时你会感谢自己已经把地基打牢了。
➡ 进入卷二《工程卷:面向对象与项目实战》,先看
02.综合案例/00.卷二总目录与导读.md(计划在卷二启动时创建)
上次更新: 2026/06/10, 11:13:41