[capture list](parameter list) -> return type {function body}
  • capture list:捕获列表,是一个lambda所在函数中定义的局部变量列表
  • parameter list、function body:与任何普通函数一样,表示参数列表和函数体。
  • return type:lambda返回类型,但必须使用尾置(->)返回来指定返回类型。

### [] 和 {} 必须存在,其他可以省略

auto l1 = [] { cout << "Good" << endl; }; // 调用 l1(),打印“Good”

### 值捕获与引用捕获

注:

  • 被捕获的变量的在lambda创建时拷贝,而不是调用时拷贝
  • 如果我们采用引用方式捕获一个变量,就必须确保被引用的对象在lambda执行的时候是存在的
  int a = 0;     
  auto l = [a]() mutable {         
  cout << "a = " << a << endl;        
  ++a; // 如果没有加mutable,++a不允许的    
  };    
  a = 19;     
  l();    // 输出 a = 0(因为是创建时拷贝)     
  l();    // 输出 a = 1     
  cout << "a = " << a << endl; // 输出 a = 19     

  // 传引用     
  int b = 0;     
  auto l2 = [&b](int param){         
   ++b;         
   ++param;         
   cout << "b = " << b << "  param = " << param << endl;    
  };     
  b = 20;     
  l2(100); // 输出 b = 21, param = 101     
  l2(104); // 输出 b = 22, param = 105     
  cout << "b = " << b << endl; // 输出 b = 22

### 捕获列表

这里我不引用许多地方的隐式捕获和显示捕获的概念,理解起来很绕。

只要记住,&表示引用捕获,=是传值捕获。
然后单独以&和=开头的话,后面的变量采用的方式相反即可。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注