避免使用默认捕获
[&](){} // 默认按引用捕获[=](){} // 默认按值捕获
初始化捕获
auto func = [pw = std::make_unique<Widget>()](){}; // 初始化捕获 c++14auto func = std::bind([](std::unique_ptr<Widget> const& pw){},std::make_unique_ptr<Widget>()); // 等效c++11写法
初始化捕获提供了一个机会指定
- “=”左侧为闭包类成员变量的名字
- “=”右侧为该成员的初始化表达式
const
默认的lambda闭包类的operator()成员函数会带有const,使用mutable饰词可以避免该问题
std::vector<int> a{};auto func1 = [b = std::move(a)]() mutable {b.push_back(1); // error, b is std::vector<int> const};auto func2 = [b = std::move(a)]() mutable {b.push_back(1); // OK};
范型闭包 c++14
auto f = [](auto x){}; // x is generic// lambda表达式的完美转发auto f = [](auto&&... params){return func(std::forward<decltype(params)>(params)...);}
