《Effective Modern C++》- 42条改善C++11与C++14的具体方法
作者: Scott Meyers
原版书名: Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14
出版社: O’Reilly Media
版权: 2015 Scott Meyers
核心观点
C++11/14不仅是”换皮肤”,而是语言的彻底 reinvention。挑战在于学习如何有效使用这些特性——使软件正确、高效、可维护、可移植。
“C++11 feels like a new language.” — Bjarne Stroustrup
关键概念
1. 类型推导(Deducing Types)
| Item | 主题 | 要点 |
|---|---|---|
| 1 | 模板类型推导 | 理解引用折叠、特殊规则 |
| 2 | auto类型推导 | 与模板推导规则相同 |
| 3 | decltype | 获取表达式类型,不执行 |
| 4 | 查看推导类型 | 利用编译器错误信息 |
2. auto的使用
- Item 5: 优先auto而非显式类型声明
- Item 6: auto推导类型不符时使用显式类型初始化器习语
// Item 5: 优先auto
auto x = 10; // int
auto y = vec.begin(); // 迭代器类型
// Item 6: 显式类型初始化器
auto z{2.0}; // error! 初始化器列表不推导为double
auto z2 = 2.0; // OK, double3. 移向现代C++
- Item 7: {}与()的区别(统一初始化)
- Item 8: nullptr优于0和NULL
- Item 9: 别名声明优于typedef
- Item 10: 作用域枚举优于非作用域枚举
- Item 11: 删除函数优于私有未定义
- Item 12: override声明覆写函数
- Item 13: const_iterator优于iterator
- Item 14: noexcept声明
- Item 15: constexpr wherever possible
- Item 16: const成员函数线程安全
- Item 17: 特殊成员函数生成规则
4. 智能指针
| Item | 主题 | 要点 |
|---|---|---|
| 18 | unique_ptr | 独占所有权资源管理 |
| 19 | shared_ptr | 共享所有权资源管理 |
| 20 | weak_ptr | 避免循环引用 |
| 21 | make_unique/make_shared | 优于直接new |
| 22 | Pimpl习语 | 在实现文件定义特殊成员函数 |
5. 右值引用、移动语义、完美转发
- Item 23: std::move与std::forward
- Item 24: 通用引用 vs 右值引用
- Item 25: rvalue ref用move,universal ref用forward
- Item 26: 避免重载通用引用
- Item 27: 通用引用重载的替代方案
- Item 28: 引用折叠规则
- Item 29: 假设移动操作不存在、不廉价、不被使用
- Item 30: 完美转发失败案例
6. Lambda表达式
- Item 31: 避免默认捕获模式
- Item 32: 用init capture移动对象入闭包
- Item 33: decltype(auto)参数用于std::forward
- Item 34: 优先lambda而非std::bind
7. 并发API
- Item 35: 优先基于task编程而非基于thread
- Item 36: 需要异步时指定std::launch::async
- Item 37: 确保thread不可join的所有路径
- Item 38: 注意不同thread handle析构行为
- Item 39: void futures用于一次性事件通信
- Item 40: std::atomic用于并发,volatile用于特殊内存
8. 微调
- Item 41: 可拷贝且移动廉价、总是拷贝的参数按值传递
- Item 42: 考虑emplace而非insert
重要原则
- 移动语义不是免费的: 假设移动操作不存在、不廉价、不被使用
- 完美转发会失败: 了解失败案例并避免
- lambda捕获需谨慎: 默认捕获模式易出错
- 原子vs易变: atomic用于并发,volatile用于特殊内存
- make函数优于直接new: 更安全、可能更快
与其他知识关联
- 《Effective C++》-第三版-55个改善程序与设计的具体做法-Scott-Meyers — C++98经典
- 《Effective STL》-50条改善STL使用的方法 — STL专项
- C++ Concurrency in Action — 并发深度指南
- Modern C++ Design — Policy-Based Design
可行动点
- 审查代码中的auto使用,确保类型推导符合预期
- 将NULL/0替换为nullptr
- 检查智能指针使用,考虑make_unique/make_shared
- lambda捕获模式审查,避免默认捕获
- 并发代码检查atomic使用
笔记元数据
- 处理日期: 2026-09-02
- 处理次数: 第274次运行
- 原文件: /books/c++/effective c++/Effective Modern C++ copy.pdf
- 文件大小: 3.87MB
- 页数: 334页
- 类型: text_based
- 提取方式: pdf-inspector