C++学习笔记(五)Lambda 表达式

C++中的Lambda表达式允许匿名函数捕获外部变量,通过不同的捕获列表方式实现引用或值传递。简单来说,Lambda表达式可以有四种形式的捕获列表:不捕获任何变量、引用捕获所有变量、值捕获所有变量以及按需指定捕获。这使得Lambda在函数内部能够重用外部变量,提供了更大的灵活性。
摘要由CSDN通过智能技术生成

lambda表达式定义了一个匿名函数,并且可以捕获所定义的匿名函数外的变量。它的语法形式是:

[ capture ] ( parameter ) option -> return_type { body; };

其中:

  • capture 捕获列表
  • parameter 参数列表
  • option 函数选项
  • return_type 函数返回值类型
  • body 函数体
    比如
// defination
auto lamb = [](int a) -> int { return a++; };

// usage
std::cout << lamb(1) << std::endl;  // output: 2

组成lambda的各部分并不是都必须存在的:

  1. 当编译器可以推导出返回值类型的时候,可以省略返回值类型的部分
auto lamb = [](int i){return i;};   // OK, return type is int
auto lamb2 = [] () {return {1, 2};};    // Error
  1. lambda表达式没有参数时,参数列表可以省略
auto lamb = []{return 1;};      // OK

所以一个最简单的lambda表达式可以是下面这样,这段代码是可以通过编译的:

int main()
{
  []{};     // lambda expression
  return 0;
}

捕获列表

捕获列表是lambda表达式和普通函数区别最大的地方。[]内就是lambda表达式的捕获列表。一般来说,lambda表达式都是定义在其他函数内部,捕获列表的作用,就是使lambda表达式内部能够重用所有的外部变量。捕获列表可以有如下的形式:

  • [] 不捕获任何变量

  • [&] 以引用方式捕获外部作用域的所有变量

  • [=] 以赋值方式捕获外部作用域的所有变量

  • [=, &foo] 以赋值方式捕获外部作用域所有变量,以引用方式捕获foo变量

  • [bar] 以赋值方式捕获bar变量,不捕获其它变量

  • [this] 捕获当前类的this指针,让lambda表达式拥有和当前类成员同样的访问权限,可以修改类的成员变量,使用类的成员函数。如果已经使用了&或者=,就默认添加此选项。

[] // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值