《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模板类型推导理解引用折叠、特殊规则
2auto类型推导与模板推导规则相同
3decltype获取表达式类型,不执行
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, double

3. 移向现代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主题要点
18unique_ptr独占所有权资源管理
19shared_ptr共享所有权资源管理
20weak_ptr避免循环引用
21make_unique/make_shared优于直接new
22Pimpl习语在实现文件定义特殊成员函数

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

重要原则

  1. 移动语义不是免费的: 假设移动操作不存在、不廉价、不被使用
  2. 完美转发会失败: 了解失败案例并避免
  3. lambda捕获需谨慎: 默认捕获模式易出错
  4. 原子vs易变: atomic用于并发,volatile用于特殊内存
  5. make函数优于直接new: 更安全、可能更快

与其他知识关联


可行动点

  • 审查代码中的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