目录

Effective Modern C++

笔记

导言

章节1. 类型推导(Deducing types)

» 条目1. 理解模板的类型推导

形参 实参 推导结果
f(T*), f(T&), f(const T&) int i; T ⇒ int
f(T*), f(T&), f(const T&) int& ri=i; T ⇒ int
f(T*), f(T&) const int& ci=i; T ⇒ const int
f(const T&) const int& ci=i; T ⇒ int
f(T&& param) lvalue 左值i,ri T ⇒ int&; param ⇒ int&
f(T&& param) rvalue 右值 f(27); f(std::move(i)) T ⇒ int; param ⇒ int&&
f(T param) int i; volatile int i; const int ci=i; const int& ri=i; T ⇒ int; param ⇒ int
f(T param) const char name[]=“oakfire T ⇒ const char*
f(T& param) const char name[]=“oakfire T ⇒ const char[8]
f(T param) void someFunc(int, double) T ⇒ void (*)(int,double)
f(T& param) void someFunc(int, double) T ⇒ void (&)(int,double)

» 条目2. 理解 auto 的类型推导

» 条目3. 理解 decltype 的类型推导

» 条目4. 了解推导类型结果的查看方法

章节2. auto 关键字

» 条目5. 优先使用 auto 而非显式类型声明

» 条目6. 当 auto 推导不出期望类型时,使用显式类型初始化

章节3. 转向现代C++

» 条目7. 创建对象(定义变量初始化)时区分 ''()'' 和 ''{}''

» 条目8. 相比 0 或 NULL优先选择使用 nullptr

» 条目9. 相比 typedefs 优先选择使用别名

» 条目10. 使用枚举时优先使用限定域枚举

» 条目11. 阻止调用时,相比私有域声明不定义方式,优先使用函数删除的方式

» 条目12. 声明覆盖函数时,使用修饰词 override

» 条目13. 优先使用 const 迭代器 const_iterator

» 条目14. 如果函数不会抛出异常,则声明为 noexpect

» 条目15. 尽可能使用 constexpr

» 条目16. 确保 const 成员函数线程安全

» 条目17. 理解特制成员函数的生成机制

章节4. 智能指针

» 条目18 使用 std::unique_ptr 管理独占资源

» 条目19 使用 std::shared_ptr 管理共享资源

» 条目20 使用 std::weak_ptr 来指向可能悬空的共享资源

» 条目21 比起new, 优先使用 std::make_unique 和 std::make_shared

» 条目22 使用 Pimpl 惯用法时,定义特制成员函数需要放在实现文件里

章节5. 右值引用、移动语义和完美转发

» 条目23 理解 std::move 与 std::forward

» 条目24 区分通值引用与右值引用

» 条目25 std::move 使用在右值引用,std::forward 使用在通值引用

» 条目26 避免重载通值引用

» 条目27 熟悉「重载通值引用」之外的替代方法

翻译对照

备注
argument 实参
parameter 形参/参数
basic guarantee 基本异常保障 basic exception safty guarantee
strong guarantee 强异常保障 strong exception safty guarantee
built-in pointer 内置指针 相对于智能指针的原指针概念
raw pointer 原生指针
universal reference 通值引用 相对“左值引用”、“右值引用”来说
scoped enums 限定域枚举
unscoped enums 非限定域枚举
forward-declared 前置声明
override 覆盖
overload 重载
maximally generic code 最泛化代码
special member function 特制成员函数