Effective Modern C++ 笔记 - Lambda表达式

Lambda表达式(Lambda)是C++编程中的游戏规则改变者。这有点令人惊讶,因为它们并没有给语言带来新的表达能力。Lambda所能做的所有事情都是您可以手动完成的,只需再多输入一点即可。但是用Lambda来创建函数对象实在是太方便了,这对日常C++软件开发的影响是巨大的。STL“_if”算法(例如,std::find_ifstd::remove_ifstd::count_if等),比较函数(例如,std::sortstd::nth_elementstd::lower_bound等)用Lambda作参数毫无压力。在STL之外,Lambda使快速创建std::unique_ptrstd::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

第五条款说过了