【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码

很遗憾,原始代码未仔细整理,只留有分享给别人的截图,来源于学习c11时的构想


【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码

陷阱点:

1、lamda[i]传值是只读复制,不能改,++无效,要用i+1

2、如果加了mutable之后,是可以改了,但改的是副本

3、如果用了引用,lamda内部会改这个值,而且lamda调用是回调,可能有非顺序的时序(多线程环境)或者复杂的流程顺序,使分析不清楚i的值

建议:lamda捕获外部变量避免写操作,必要时,外部调用也要同步为宜,也就是等着lamda调用结束。


【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码

这里就是介绍了多种可调用对象以及如何统一管理,统一转换为std::function


【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码

explicit隐式转换声明加上,避免隐式转换


【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码

输出一个是6,一个是7,也就是函数默认参数如果不一致,即使声明了虚函数覆盖了,也会使用不同的默认值


【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码

名称覆盖,纯函数名,不含参数,重载也无效,在从重继承之下,容易出现,比如id name、deal等不带有具体差异化操作的接口上


【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码

【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码

声明虚函数导致移动拷贝无效,要避免。但实际中使用的类,基本都需要析构。所以要合理设计,使复制较慢的类避免拷贝。


【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码

模板返回类型依赖参数时,是无法定义返回类型的,之前的做法多指向基类或void*,新特性的尾置返回类型解决了这个问题

-> 后面表示返回类型,通过decltype获取,获取的是 引用类型,通过std::remove_refercence去除引用


【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码

可以传递数组引用了,注意,函数内获取sizeof(arr)返回指针已经不再绝对成立了