跳转至

校准基础认知

建立 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:同步原语更完整,协程进入语言层