Skip to content

Latest commit

 

History

History
111 lines (76 loc) · 6.18 KB

File metadata and controls

111 lines (76 loc) · 6.18 KB

C++11:现代 C++ 的起点

C++11 是从传统 C++ 走向现代 C++ 的关键版本。它没有抛弃静态类型、确定性析构和零开销抽象,而是让类型推导、资源所有权、局部函数对象、泛型编程和并发模型拥有更直接的语言表达。

本专题面向已经掌握 C++98/03 基础的读者。文章不要求一次记住所有标准规则,而是按照“旧代码的问题 → 新语法 → 可运行示例 → 底层模型 → 工程边界”的顺序逐层展开。

如何阅读

每篇文章分成两个层次:

  1. 入门层:学习目标、C++03 痛点、最小语法、完整示例和输出解释;
  2. 进阶层:精确语义、对象模型、生命周期、性能、版本边界和审查清单。

第一次阅读先完成入门层并亲自运行主示例。第二次阅读再关注值类别、所有权、异常保证、迭代器失效和 happens-before 等底层概念。

所有标记为 cpp 的代码块都由仓库验证器提取,并以 -std=c++11 -Wall -Wextra -pedantic 编译运行。错误写法使用行内代码或 text 围栏,避免把反例伪装成可运行程序。

推荐学习路线

先阅读基础知识,再按下面顺序学习。只需完成每篇的入门部分就可以继续;并发与模板进阶不必成为学习普通语法的门槛。

第一阶段:局部代码与基本表达

  1. 类型推导:auto 与 decltype
  2. 列表初始化与 nullptr
  3. 范围 for
  4. Lambda 的参数与捕获

重点是识别副本和引用、看懂输出、写出简单循环与回调。

第二阶段:对象与资源管理

  1. 类定义能力增强
  2. 移动语义入门,暂时跳过完美转发
  3. 智能指针
  4. 容器增强

重点是说明谁负责释放资源、什么时候会复制或转移、观察者什么时候失效。

第三阶段:模板与编译期能力

  1. 参数包与类型别名,先学声明和递归展开
  2. tuple、类型萃取与调用工具
  3. constexpr 与 static_assert
  4. 返回完美转发与引用折叠,再看模板工厂

这一阶段才进入类型推导细节、SFINAE(模板替换失败时移除候选)与泛型接口设计,不要求先读懂所有高级重载规则。

第四阶段:实用库与并发

  1. noexcept、字面量、对齐与线程局部存储
  2. chrono、随机数与正则
  3. 并发编程

并发先学线程生命周期、锁与条件变量,再学原子与内存序。完成后进入 C++14。

验证本版本示例

从仓库根目录运行:

python3 tools/verify_examples.py --compiler clang++ --path docs/cpp11
python3 tools/verify_examples.py --compiler g++ --path docs/cpp11

普通示例要求 GCC 与 Clang;请用 --version 确认编译器身份。GCC 专用示例在 Clang 下跳过,属于未验证项。

特性覆盖矩阵

领域 主要特性 对应专题
类型推导 auto、decltype、尾置返回类型、cv/ref 类型推导
初始化 列表初始化、窄化、initializer_list、nullptr 统一初始化
循环 范围 for、begin/end 查找、循环变量引用 范围 for
对象转移 右值引用、移动构造、move、forward 移动语义
局部调用对象 Lambda、捕获、闭包、函数指针转换 Lambda
泛型 参数包、递归展开、别名模板 模板
编译期 constexpr、字面类型、static_assert 编译期
类设计 default/delete、override/final、委托/继承构造、enum class 类改进
核心设施 noexcept、用户字面量、thread_local、alignas、C++11 属性 核心工具
所有权 unique_ptr、shared_ptr、weak_ptr、控制块 智能指针
容器 array、forward_list、无序容器、emplace 容器增强
调用与类型工具 tuple、type traits、function、bind 函数工具
通用库 chrono、随机引擎与分布、正则 实用库
并发 线程、互斥量、条件变量、Future/Promise、async、原子 并发

C++11 弃用与迁移索引

“不推荐”不等于“标准正式弃用”。本专题依据 C++11 的版本事实区分两者:

C++11 正式弃用项 迁移方向 详见
std::auto_ptr 根据语义迁移到 unique_ptr、shared_ptr 或非拥有引用 智能指针
register 删除提示,让编译器负责寄存器分配 核心工具
动态异常说明 throw(T...) 使用普通异常文档和准确的 noexcept 契约 核心工具
bind1st、bind2nd、ptr_fun、mem_fun 等旧适配器 优先使用 Lambda,必要时使用 bind/function 函数工具
部分隐式复制生成行为 明确采用零法则或五法则 类改进

以下项目常被误写成“C++11 已弃用”,实际并非如此:

  • random_shuffle 到 C++14 才弃用,C++17 移除;
  • [=] 对 this 的隐式捕获到 C++20 才弃用;
  • 函数 try block 和 C 风格转换可因可读性不推荐,但不是 C++11 正式弃用项;
  • [[nodiscard]] 是 C++17 属性,不能作为 C++11 属性示例;
  • make_unique 是 C++14 库设施,C++11 示例不能使用。

参考与事实核对

具体版本归属和规范性行为以 C++11 工作草案、标准条文及后续缺陷修正为准。正文采用原创中文讲解,并明确区分标准事实、工程建议与后续版本变化。

返回仓库总览