校准基础认知¶
建立 C++11、C++14、C++17、C++20 的整体版本地图,先把边界理清。
目标:看到一个特性时,先能判断它属于哪个标准、解决哪类问题、在整体演进里处于哪一层,以及它主要在替代什么旧写法,而不是把 11、14、17、20 混成一团。
1 版本定位¶
-
C++11 现代 C++ 起点
类型推导、move 语义、lambda、智能指针、基础并发、constexpr 起步 -
C++14 对 C++11 的补强
让推导、更泛型化写法、constexpr 更顺手 -
C++17 工程实用性明显增强
模板分支、值封装、视图类、文件系统、推导简化开始成熟 -
C++20 语言约束e与标准库继续升级
概念约束、span、format、source_location、协程、同步原语继续完善
2 类型推导与泛型¶
解决:类型书写冗长、泛型表达能力不足、模板约束不清晰
-
auto —— C++11
替代:显式长类型声明 -
decltype —— C++11
替代:模板上下文中手写复杂类型 -
decltype(auto) —— C++14
替代:返回类型保真不足,容易丢引用 / cv 属性 -
泛型 lambda —— C++14
替代:手写仿函数、单独写模板函数对象 -
类模板实参推导(CTAD)—— C++17
替代:显式写类模板参数 -
concepts / requires —— C++20
替代:无约束模板、SFINAE、enable_if
C++11:开始“少写类型”
C++14:让推导和泛型 lambda 更自然
C++17:连模板实参也开始省略
C++20:从“能写泛型”升级到“能约束泛型”
3 编译期能力与条件分发¶
解决:哪些逻辑能放到编译期、模板代码如何按条件分发、初始化约束如何表达
-
constexpr —— C++11
替代:只能做很弱的编译期计算 -
增强版 constexpr —— C++14
替代:早期 constexpr 可写性太弱 -
if constexpr —— C++17
替代:普通 if + 模板特化绕行、SFINAE 分发 -
consteval / constinit —— C++20
替代:编译期求值要求不明确、静态初始化约束表达不清
C++11:constexpr 起步,但能力偏弱
C++14:constexpr 可写性增强
C++17:if constexpr 让模板分支真正可读
C++20:进一步区分“必须编译期求值”和“静态初始化约束”
4 值语义与类型封装¶
解决:资源所有权、可空值表达、多类型封装、任意值承载、连续内存视图表达
-
智能指针(资源所有权)—— C++11
替代:裸 new / delete、手工生命周期管理 -
std::optional(有值 / 无值)—— C++17
替代:特殊值、bool + out 参数、空指针表示失败 -
std::variant(多选一类型安全联合)—— C++17
替代:union + 手工维护活跃成员、部分基类指针 + dynamic_cast 分发 -
std::any(任意类型容器)—— C++17
替代:void* + 手工转型、弱约束通用承载 -
std::span(非 owning 连续内存视图)—— C++20
替代:T* + size、多套数组 / vector / array 接口
C++11:先解决资源管理标准化
C++17:补齐值封装工具
C++20:补齐连续内存的轻量视图表达
5 字符串、视图与轻量传参¶
解决:字符串所有权与只读视图的分离,从 owning object 走向 non-owning view
-
std::string(拥有数据)—— 基础能力
-
std::string_view(只看不拥有,强调轻量传参和视图语义)—— C++17
替代:const std::string& 到处传、const char* / std::string 混杂接口
6 文件系统与工程实用库¶
解决:路径/文件操作标准化、格式化输出标准化、调用点信息标准化
-
std::filesystem —— C++17
替代:平台相关文件 API、手工拼路径字符串 -
std::format —— C++20
替代:sprintf / snprintf、字符串拼接 + 流式输出混用 -
std::source_location —— C++20
替代:手工传 FILE / LINE / func
C++17:filesystem 进入标准库,工程能力明显增强
C++20:format、source_location 继续补齐通用工程工具
7 并发与异步演进¶
解决:线程与互斥基础设施、多锁管理、线程协作同步、异步流程表达
-
std::thread、mutex、lock_guard —— C++11
替代:平台私有线程接口、手工 lock / unlock -
std::scoped_lock —— C++17
替代:多个锁手工管理顺序 -
latch、barrier、semaphore —— C++20
替代:自旋、手工计数协议、弱抽象同步控制 -
coroutines —— C++20
替代:回调链、手写状态机、拆碎的异步流程
C++11:并发基础设施进入标准库
C++17:锁管理进一步简化
C++20:同步原语更完整,协程进入语言层