0.1 C++20关键特性
C++20 是继 C++11 之后最重要的一次升级,引入了 concepts、ranges、coroutines、modules 和三路比较运算符 等核心能力,被认为是"第二次现代化" 。
这些特性本质解决三类问题:
- 模板难用(concepts)
- STL 不直观(ranges)
- 异步复杂(coroutine)
- 编译慢(modules)
- 比较繁琐(<=>)
1 concepts 模板约束
1.1 一、为什么需要 concepts?
传统模板的问题:
cpp
template<typename T>
T add(T a, T b) {
return a + b;
}
👉 如果传入错误类型(比如 string 不支持 +),
👉 编译器报错极其复杂
1.2 二、concept 的核心作用
👉 在编译期约束类型
cpp
#include <concepts>
template<typename T>
concept Addable = requires(T a, T b) {
a + b;
};
1.3 三、使用方式
cpp
template<Addable T>
T add(T a, T b) {
return a + b;
}
1.4 四、效果
- 编译错误更清晰
- 模板语义更明确
- 替代 SFINAE
👉 本质:给模板加"类型接口"
1.5 五、你要掌握的重点
- requires 表达式
- concept 定义
- concept 约束模板
2 ranges
2.1 一、传统 STL 的问题
cpp
std::vector<int> v = {1,2,3,4,5};
for (auto it = v.begin(); it != v.end(); ++it) {
if (*it % 2 == 0) {
std::cout << *it;
}
}
👉 啰嗦 + 容易出错
2.2 二、ranges 的核心思想
👉 像管道一样操作数据(函数式风格) (studylib.net)
2.3 三、基本用法
cpp
#include <ranges>
#include <vector>
#include <iostream>
std::vector<int> v = {1,2,3,4,5};
for (int x : v
| std::views::filter([](int x){ return x % 2 == 0; })
| std::views::transform([](int x){ return x * 2; })
) {
std::cout << x;
}
2.4 四、核心组件
views::filterviews::transformviews::takeranges::sort
2.5 五、本质理解
👉 ranges = STL + 管道 + 惰性计算
2.6 六、优势
- 更简洁
- 更安全(少越界)
- 更接近业务表达
3 coroutine 协程
3.1 一、协程是什么?
👉 可以暂停/恢复的函数 (Educative)
3.2 二、为什么需要?
传统异步:
cpp
// 回调地狱 / 多线程复杂
3.3 三、C++20 协程关键字
co_awaitco_yieldco_return
3.4 四、简单示例(生成器)
cpp
#include <coroutine>
#include <iostream>
struct Generator {
struct promise_type {
int value;
auto get_return_object() { return Generator{}; }
std::suspend_always yield_value(int v) {
value = v;
return {};
}
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() {}
};
};
Generator gen() {
co_yield 1;
co_yield 2;
}
3.5 五、本质理解
👉 coroutine = 状态机 + 挂起点
3.6 六、适用场景
- IO(网络 / 文件)
- 异步任务
- 游戏循环
- 嵌入式事件驱动
3.7 七、关键认知
👉 C++20 只提供"框架",不是完整库 (Educative)
4 modules 替代头文件
4.1 一、传统 include 的问题
cpp
#include "a.h"
#include "b.h"
问题:
- 编译慢
- 重复包含
- 宏污染
4.2 二、modules 的核心思想
👉 按模块组织代码,而不是文本复制
4.3 三、基本写法
4.3.1 定义模块
cpp
export module math;
export int add(int a, int b) {
return a + b;
}
4.3.2 使用模块
cpp
import math;
int main() {
add(1, 2);
}
4.4 四、优势
- 编译更快
- 不依赖宏
- 结构更清晰 (Educative)
4.5 五、本质理解
👉 modules = 编译级别的封装(不是文本包含)
4.6 六、现实情况
- 工业支持还不完全
- 需要新编译器 / 构建系统
5 三路比较(<=>)
5.1 一、问题
传统比较:
cpp
a < b
a > b
a == b
👉 要写很多函数
5.2 二、C++20 解决方案
👉 三路比较运算符 <=>(spaceship)
5.3 三、基本用法
cpp
#include <compare>
struct Point {
int x, y;
auto operator<=>(const Point&) const = default;
};
5.4 四、效果
👉 自动生成:
<>==!=<=>=
5.5 五、返回值类型
std::strong_orderingstd::weak_orderingstd::partial_ordering(阿荣的个人网站)
5.6 六、示例
cpp
Point a{1,2}, b{2,3};
if ((a <=> b) < 0) {
// a < b
}
5.7 七、本质理解
👉 <=> = 一次比较,得到所有关系
6 总结(必须记住)
| 特性 | 解决问题 |
|---|---|
| concepts | 模板类型安全 |
| ranges | 数据处理简化 |
| coroutine | 异步复杂性 |
| modules | 编译与结构 |
| <=> | 比较逻辑 |
7 最关键一句话总结
👉 C++20 本质是:
让 C++ 从"难用但强大" → "强大且可控"
8 学习优先级(给你建议)
- concepts(必须掌握)
- ranges(高频使用)
- coroutine(进阶)
- <=>(简单但实用)
- modules(了解即可)