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改变的是其内部的成员。