Lambda表达式详解

Lambda 简介

Lambda 表达式是 C++11 引入的新特性。

Lambda 是一个可以定义在函数内部的、可调用的代码单元,可以将其理解为匿名的内联函数。Lambda 表达包含捕获列表参数列表返回类型(形式为尾指返回类型)和函数体

[capture list](parameter list) -> return type {function body}

参数列表和返回类型可以省略:省略参数列表代表参数列表为空;省略返回类型,编译器将根据 return 语句返回的表达式类型推断返回类型,如果没有 return 语句则返回类型为 void

例如:

auto add = [](int a, int b)->int {
	return a + b;
};

定义一个 Lambda 表达式时,编译器生成一个与之对应的、新的、未命名的类类型,这个类重载了调用运算符,并指定其为 const

Lambda 捕获

Lambda 可以在捕获列表中指定需要捕获的外部变量,有值捕获引用捕获两种形式。

Lambda 生成的类中包含对应捕获变量的数据成员,并且在 Lambda 创建时进行初始化:

int x = 0;
auto f = [x] {cout << x; };
x = 1;
f();	// 输出为0

Lambda 也可以隐式捕获变量,方法是在捕获列表中写一个 =& ,让编译器根据函数体中的代码来推断我们需要哪些变量:

int x = 0, y = 1;
auto f = [&] {cout << x << ' ' << y; };
f();	// 输出为0 1

前面提到,Lambda 表达式重载的调用运算符是 const 的,所以如果想在函数体中修改值捕获的变量,必须定义 Lambda 时加上 mutable 关键字,此时参数列表不能省略:

int x = 0;
auto f = [=]()mutable { x++; };
f();
// 执行后x仍然为0,因为f改变的是其内部的成员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值