第一章 型别推导
1. 条款1:理解模板型别推导
a) paramType和T之间的推导规则
i. paramType是个指针或引用,但不是万能引用—这种情况按直观认知
ii. paramType是万能引用,
1. 如果expr是左值,T就是左值引用,这是T被推导成引用的唯一种情形。paramTpe也是左值引用。这里要注意的是,虽然声明中是右值引用的语法,但是实际还是左值引用
2. 如果expr是右值,T是右值,paramTpe是右值引用。
iii. Paramtype既非指针也非引用
1. 按值传递,创建析的副本
b) 数组实参
i. 如果paramType是值,退化为指针
ii. 如果paramType是引用,会带有数组尺寸
2. 条款2:理解auto型别推导
a) 推导规则和条款1一样,也分三种情况,重点是第二种
b) 对于{}要当心,会在初始化和初始化列表产生歧义
3. 条款3,理解decltype
i. auto f() ->decltype(std::forward<>())
ii. 和decltype对应的return 不要加括号
iii. Decltyp对于左值表达式,总是T&
iv. C++14支持decltype(auto)
第二章
4. 条款4,掌握查看
的方法
a) Std::cout< 5. 条款5,优先选用auto,而非显式型别声明 a) 能用auto就用auto, 少打字效率高 6. 条款6,auto不符合要求时,用显式初始化 a) auto x = static_cast 第三章 转向现代C++ 7. 条款7,在创建对象时注意区分()和{} 8. 条款8,优先选用nullptr,而非0或NULL 9. 条款9,优先选用别名,而非typedef a) Typedef不支持模板化 b) 可以免写::type 10. 条款10,优先选用限定作用域的枚举型别,而非不限作用域的枚举型别 11. 条款11,优先选用delete,而非未实现的private未定义函数 12. 条款12,为已在改写的函数添加override声明 13. 条款13,优先选用const_iterator,而非iterator a) 理由不充分 14. 条款14:只要函数不会发射异常,就为其加上noexcept声明 a) 大多函数没必要,只有移动,swap,内存释放和析构最有价值 15. 条款15:只要有可能使用constexpr,就使用它 a) 意味着在编译期进行计算 16. 条款16,保证const成员函数的线程安全性 17. 条款17,理解特种函数生成机制 a) 声明了复制构造,复制赋值或析构任何一个,就得同时声明所有 b) 移动操作生成条件:(1)未声明复制(2)未声明移动(3)未声明析构 c) 要想依赖自动生成的复制构造或复制赋值,就加=default d) 成员函数模板在任何情况下都不会抑制特种函数的生成 第四章 智能指针 18. 条款18,使用std::unique_ptr管理具备专属所有权的资源 a) 析构是类型的一部分 19. 条款19,使用std::shared_ptr管理具备共享所有权的资源 a) 析构不是类型一部分 b) 三种情况会生成控制块 i. Make_shared ii. 从unique_ptr到shared_ptr iii. 从裸指针到shared_ptr c) 异步调用处理 i. 错误做法是,向异步处理对象塞入this,但this会析构,异步处理会core ii. 正确做法,先继承enable_shared_from_this, 再向异步处理对象塞入shared_from_this() iii. 总之,不能让有机会直接取this,一定要受控于控制块 20. 条款20, 对于类似shared_ptr有可能空悬,要用weak_ptr替换 a) 可以检测空悬:expired()方法 b) 可以取到资源:lock()方法 c) 用武之地:缓存,观察者列表,避免形成指针环路 21. 条款21, 优先使用make_uniqu或make_shared,而非new a) 如果分步(先创建,再使用),可以先make_shared,再move 22. 条款22, 使用pimp习惯用法时,要把pimp的定义写在特殊函数实现文件里 a) 前提是使用unique_ptr, 因为析函数会释放unique_ptr指向的实现对象,所以实现对象pimp要提前定义。 第五章 、移动语义和完美转发 23. 条款23 :理解std::move和std::forword a) std::mvoe:无条件类型转换,转成右值,没有移动的意思 b) std::forword:有条件转换,当实参绑定到右值时,才强制转成右值 c) 运行期,move和forward没有任何操作 24. 条款:24区分万能引用和右值引用 a) T&&,既可以表示右值引用,也可以表示万能引用: i. 函数模板 T&& ii. auto&& b) 若使用右值初始化万能引用,就会得到一个右值引用;若采集左值初始化,就会得到一个左值引用 25. 条款25:针对右值实施std::move, 针对万能引用std::forward a) 对右值最后一次使用实施move,对万能引用最后一次使用实施forward b) 按值返回的函数的右值和万能引用,采集上述相同行为 c) 若局部对象可能适用于返回值优化,勿实施move和forward 26. 条款26:避免依万能引用型别进行重载 a) 不要把万能引用的函数进行重载,万能引用会吸走大批实参型别 27. 条款27:万能引用重载的替代方案 a) 取不同的函数名 b) 传递const T& c) 传值 d) 标签分类 i. 用一些现成的std分类模板函数,对万能引用进行限制,这样实参就不会被万能引用吸走了 28. 条款28:理解引用折叠 a) 原始引用中任一引用为左值,结果为左值,否则为右值引用 b) 万能引用在型别推导时会发生折叠引用 29. 条款29:假定移动操作不存在、成本高、未使用 30. 条款30:熟悉完美转发的失败情形 a) 完美转发的失败情形,源于模板推导失败,或推导错误 b) 大括号初始化,值0或NULL表示容指针、static const成员变量(没有定义,只有声明默认值),模板或重载函数名字,位域。 第六章 31. 条款31:避免默认捕获模式 a) 按引用的默认捕获会导致空悬指针问题 b) 按值的默认捕获极易受空悬指针影响(this),并会误导人们认为lambda式是自洽的 32. 条款32:使用初始化捕获将对象移入闭包 a) Lambda表达式本质是生成一个类且创建一个类的对象 b) C++11没办法将右值移入闭包,C++14可以 c) C++11可以用bind模拟 33. 条款33:对auto&&型别的开参使用decltype以std::forward之 a) C++14可以在lambda中使用auto 34. 条款34:优先选用lambda式,而非std::bind a) 可读性高,效率也高 b) C++11中,lambda可以替换bind, bind最有价值在于C++11无法使用移动捕获(C++14已支持)
留言与评论(共有 0 条评论)
“”