概述
C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda
的语法形式如下:
1
2
3
4
5
6
7
|
[捕获列表] (参数) mutable 或 exception 声明 -> 返回值类型 {函数体}
//计算两个值的和
auto func = []( int a, int b) -> int { return a+b;};
//当返回值的类型是确定时,可以忽略返回值
auto func = []( int a, int b){ return a + b;};
//调用
int sum = func(1, 3);
|
语法分析
捕获列表
Lambda 表达式相当于一个类,那么捕获列表就是传递给这个类的类成员。比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class Labmda
{
public :
const int test;
Labmda( int value):test(value)
{
}
public :
int run( int a, int b)
{
return a + b + test;
}
}
int main()
{
int test = 10;
auto func = Labmda(test);
int sum = func.run(1, 3);
}
//使用Lambda 表达式的写法
int main()
{
int test = 10;
auto func = [test]( int a, int b){ return a + b + test;};
int sum = func(1, 3);
}
|
捕获列表有以下格式:
格式 | 描述 |
---|---|
[] | 不带任何参数 |
[=] | Lambda表达式之前的局部变量,包括所在类的this,变量按值方式传递 |
[&] | Lambda表达式之前的局部变量,包括所在类的this,变量按引用方式传递 |
[this] | Lambda表达式所在类的this |
[a] | Lambda表达式之前的局部变量a的值,也可以传入多个值,如[a , b] |
[&a] | Lambda表达式之前的局部变量a的引用 |
关键字声明
关键字声明一般都很少用到,也不建议随便使用,可以忽略不计。
mutable
当捕获列表以值的方式传递时有效,加上此关键字后,可以修改Lambda类成员(带const修饰符)。比如:
1
2
3
4
5
|
int test = 10;
//编译报错,test成员不能修改
auto func = [test]( int a, int b){test = 8; return a + b + test;};
//编译正常
auto func = [test]( int a, int b) mutable {test = 8; return a + b + test;};
|
这里需要注意的是:Lambda类成员test
修改之后,并不会改变外部int test
的值。
exception
exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)
示例
捕获列表按值传递
1
2
3
4
|
int test = 10;
auto func = [=]( int a, int b){ return a + b + test;};
auto func2 = [test]( int a, int b){ return a + b + test;};
int sum = func(1, 3); //sum等于14
|
这里需要注意的是func
表达式中test
的值只更新到表达式之前:
1
2
3
4
|
int test = 10;
auto func = [=]( int a, int b){ return a + b + test;};
test = 5;
int sum = func(1, 3); //sum还是等于14
|
捕获列表按引用传递
1
2
3
4
|
int test = 10;
auto func = [&]( int a, int b){test = 5; return a + b + test;};
auto func2 = [&test]( int a, int b){test = 5; return a + b + test;};
int sum = func(1, 3); //sum等于9,test等于5
|
这里func
表达式中test
的值就能随时更新:
1
2
3
4
|
int test = 10;
auto func = [&]( int a, int b){ return a + b + test;};
test = 5;
int sum = func(1, 3); //sum等于9,test等于5
|
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://www.cnblogs.com/yaronzz/p/15405364.html