避免使用默认捕获

  1. [&](){} // 默认按引用捕获
  2. [=](){} // 默认按值捕获

初始化捕获

  1. auto func = [pw = std::make_unique<Widget>()](){}; // 初始化捕获 c++14
  2. auto func = std::bind(
  3. [](std::unique_ptr<Widget> const& pw){},
  4. std::make_unique_ptr<Widget>()
  5. ); // 等效c++11写法

初始化捕获提供了一个机会指定

  1. “=”左侧为闭包类成员变量的名字
  2. “=”右侧为该成员的初始化表达式

const

默认的lambda闭包类的operator()成员函数会带有const,使用mutable饰词可以避免该问题

  1. std::vector<int> a{};
  2. auto func1 = [b = std::move(a)]() mutable {
  3. b.push_back(1); // error, b is std::vector<int> const
  4. };
  5. auto func2 = [b = std::move(a)]() mutable {
  6. b.push_back(1); // OK
  7. };

范型闭包 c++14

  1. auto f = [](auto x){}; // x is generic
  2. // lambda表达式的完美转发
  3. auto f = [](auto&&... params){
  4. return func(std::forward<decltype(params)>(params)...);
  5. }