Effective Modern C++
Effective Modern C++
https://github.com/CnTransGroup/EffectiveModernCppChinese/
https://cntransgroup.github.io/EffectiveModernCppChinese/
一、类型推导
1.理解模板类型推导
2.理解auto类型推导
3.理解decltype
4.学会查看类型推导结果
二、auto
5.优先考虑auto而非显式类型声明
6.auto推导若非已愿,使用显式类型初始化惯用法
三、移步现代C++
7.区别使用()和{}创建对象
8.优先考虑nullptr而非0和NULL
9.优先考虑别名声明而非typedefs
10.优先考虑限域枚举而非未限域枚举
11.优先考虑使用deleted函数而非使用未定义的私有声明
12.使用override声明重写函数
13.优先考虑const_iterator而非iterator
14.如果函数不抛出异常请使用noexcept
15.尽可能的使用constexpr
16.让const成员函数线程安全
17.理解特殊成员函数函数的生成
四、智能指针
18.对于独占资源使用std::unique_ptr
19.对于共享资源使用std::shared_ptr
20.当std::shared_ptr可能悬空时使用std::weak_ptr
21.优先考虑使用std::make_unique和std::make_shared而非new
22.当使用Pimpl惯用法,请在实现文件中定义特殊成员函数
五、右值引用,移动语义,完美转发
23.理解std::move和std::forward
24.区别通用引用和右值引用
25.对于右值引用使用std::move,对于通用引用使用std::forward
26.避免重载通用引用
27.熟悉重载通用引用的替代品
28.理解引用折叠
29.认识移动操作的缺点
30.熟悉完美转发失败的情况
六、Lambda表达式
31.避免使用默认捕获模式
32.使用初始化捕获来移动对象到闭包中
33.对于std::forward的auto&&形参使用decltype
34.优先考虑lambda表达式而非std::bind
七、并发API
35.优先考虑基于任务的编程而非基于线程的编程
36.如果有异步的必要请指定std::lauch::async
37.从各个方面使得std::threads
unjoinable
38.关注不同线程句柄析构行为
39.考虑对于单次事件通信使用void
40.对于并发使用std::atomic,volatile用于特殊内存区
八、微调
41.对于哪些可移动总是被拷贝的形参使用传值方式
42.考虑就地创建而非插入