lambda表达式
lambda表达式是什么?
Lambda 表达式(通常称为 Lambda)是一种在被调用的位置或作为参数传递给函数的位置定义匿名函数对象(闭包)的简便方法。
lambda表达式的语法
1
[capture list] (parameters) mutable throw() -> return-type {statement}
capture list: 在C ++规范中也称为Lambda导入器, 捕获列表总是出现在Lambda函数的开始处。实际上,[]是Lambda引出符。编译器根据该引出符判断接下来的代码是否是Lambda函数,捕获列表能够捕捉上下文中的变量以供Lambda函数使用。
parameters: 与普通函数参数列表一致。不需要参数传递时,可以省略“()”。
mutable: mutable修饰符修饰的函数为可变函数, 默认情况下Lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不可省略(即使参数为空)。
throw(): 用于Lamdba表达式内部函数抛出异常。
return-type: 函数的返回值类型,不需要返回值时可以连“->”一起省略。若在返回值类型明确的情况下省略该部分,编译器会对返回值类型进行自动推导。
{statement}: 函数体,可以使用函数参数和所有capture list捕获的变量。
capture list详解
Lambda 可在其主体中引入新的变量(用 C++14),它还可以访问(或“捕获”)周边范围内的变量。 Lambda 以 capture 子句开头。 它指定捕获哪些变量,以及捕获是通过值还是通过引用进行的。 有与号 (
&) 前缀的变量通过引用进行访问,没有该前缀的变量通过值进行访问。空 capture 子句
[ ]指示 lambda 表达式的主体不访问封闭范围中的变量。[&]表示通过引用捕获引用的所有变量,而[=]表示通过值捕获它们。
注意:捕获列表不允许变量重复传递。例如[=, a]或[&,&a],=已经通过值捕获方式捕获了所有变量,&已经通 过引用捕获方式捕获了所有变量。
lambda表达式示例
[]不捕获任何变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using namespace std;
int main(){
auto func = [](string words) -> void{
/*
[]:捕获列表为空,表示不捕获任何变量
words:函数参数
->void:函数返回值为void
*/
cout << "hello," << words << endl;
};
func("world");
return 0;
}[&]以引用传递方式捕获所有变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using namespace std;
int main(){
int i = 3;
int j = 4;
auto func = [&]() -> void{
// [&]:以引用传递方式捕获变量
// ->void:函数返回值为void
cout << "i:" << i << " j:" << j << endl;
};
func();
return 0;
}[=]以值传递方式捕获所有变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include<iostream>
#include<string>
using namespace std;
int main(){
int num1 = 1;
int num2 = 2;
auto add = [=]() -> int{
/*
[=]:以值传递方式捕获变量
->int:函数返回值为int
*/
return num1 + num2;
};
int sum = add();
cout << "num1+num2=" << sum << endl;
return 0;
}