C++20 是继 C++11 之后最大的一次更新,带来了四大革命性特性。
计划中的内容
Concepts(概念)
- Concepts 基础 — 约束模板参数的类型
- 标准库 Concepts — std::integral、std::invocable 等
- requires 子句与 requires expression — 约束到底写在哪里
- Concepts 与重载/偏特化 — 让“选择哪个模板”变得可控
- Concepts 实战 — 让编译错误从“天书”变成“提示”
Ranges(范围)
- Ranges 入门 — 管道式数据处理
- Views 详解 — 惰性求值的视图
- Ranges 算法与 projection — ranges::sort / ranges::find 的新玩法
- sentinel 与 range 迭代器模型 — 为什么它不再强迫 begin/end 同类型
- 自定义 view(进阶) — 自己写一个 view 适配器
Coroutines(协程)
- 协程基础 — co_await、co_yield、co_return
- 异步编程 — 用协程简化异步代码
- 协程机制拆解 — promise_type / awaiter / awaitable
- generator vs task — 两类最常见的协程形态
- 协程的代价与工程现实 — 分配、调试、ABI、库生态
Modules(模块)
- 模块入门 — 告别 #include
- 模块实战 — 组织大型项目
- 模块语法与单元划分 — interface / implementation / export
- 迁移策略 — 从头文件工程逐步走向 Modules
- Header Units — “先别动代码”也能吃到模块化收益吗
其他特性
- 三路比较运算符 <=> — 一次定义所有比较
- std::format — 类型安全的格式化
- constexpr 增强 — 编译期计算更强大
- consteval / constinit / is_constant_evaluated — 把“编译期”说清楚
- 指定初始化(Designated Initializers) — 结构体初始化终于像人话
- using enum — 少写枚举名前缀,但不牺牲作用域
- char8_t 与 UTF-8 字面量 — u8 到底变了什么
- std::span — 轻量的“数组视图”
- std::source_location — 更便宜的日志/断点信息
- std::chrono 日历与时区 — 时间 API 终于像现代库
- std::jthread / stop_token — 可取消的线程
- std::atomic wait/notify — 比条件变量更轻的阻塞与唤醒
- 同步原语 — latch / barrier / semaphore
- std::atomic_ref — 不改类型也能原子化
- std::bit_cast 与 std::endian — 位级操作的现代写法
- 容器与字符串小增强 — contains / starts_with / ends_with / erase_if
- std::numbers 数学常量 — pi 终于不用自己写
- std::osyncstream — 多线程输出不再互相打架