Lambda表达式(Lambda)是C++编程中的游戏规则改变者。这有点令人惊讶,因为它们并没有给语言带来新的表达能力。Lambda所能做的所有事情都是您可以手动完成的,只需再多输入一点即可。但是用Lambda来创建函数对象实在是太方便了,这对日常C++软件开发的影响是巨大的。STL“_if”
算法(例如,std::find_if
、std::remove_if
、std::count_if
等),比较函数(例如,std::sort
、std::nth_element
、std::lower_bound
等)用Lambda作参数毫无压力。在STL之外,Lambda使快速创建std::unique_ptr
和std::shared_ptr
的自定义删除器成为可能,并且它们也能使线程API中条件变量简单明了。除了标准库之外,Lambda还为一次性调用的回调函数、接口适应函数和上下文相关函数的动态规范提供了便利。Lambda确实使c++成为一种更令人愉快的编程语言。
31.不要使用全局捕获模式
理由: 全局引用捕获可能会造成悬空指针, 全局的值捕获误导我们lambda是自包含的, 实际上不一定。
32.用初始化捕获把对象移到闭包中
1 2 3 4 5 6
| auto pw = std::make_unique<Widget>();
auto func = [pw = std::move(pw)] { }
|
1 2 3 4
| auto func = [pw = std::make_unique<Widget>()] { }
|
33.用std::forward
传递参数, 用decltype
推导auto&&
参数类型
1 2
| auto f = [](auto&& x) { return normalize(std::forward<decltype(x)>(x)); };
|
1 2
| auto f = [](auto&&... x) { return normalize(std::forward<decltype(x)>(x)...); };
|
思考, 把套路用宏定义一下是不是更方便?
1
| #define FORWARD(x) std::forward<decltype(x)>(x)
|
34. 优先用lambda代替std::bind
第五条款说过了