帮助你改善C+11和C++14的高效用法

帮助你改善C+11和C++14的高效用法

第一章 型别推导

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,掌握查看

帮助你改善C+11和C++14的高效用法

的方法

a) Std::cout<

5. 条款5,优先选用auto,而非显式型别声明

a) 能用auto就用auto, 少打字效率高

6. 条款6,auto不符合要求时,用显式初始化

a) auto x = static_cast

帮助你改善C+11和C++14的高效用法

第三章 转向现代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) 成员函数模板在任何情况下都不会抑制特种函数的生成

帮助你改善C+11和C++14的高效用法

第四章 智能指针

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要提前定义。


帮助你改善C+11和C++14的高效用法

第五章

、移动语义和完美转发

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成员变量(没有定义,只有声明默认值),模板或重载函数名字,位域。


帮助你改善C+11和C++14的高效用法

第六章


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 条评论) “”
   
验证码:

相关文章

推荐文章