lambda表达式的语法形式:
[ capture ] ( params ) opt -> ret { body; };
[capture](parameters) mutable ->return-type{statement}
其中carpture是捕获列表,params是参数,opt是选项,ret则是返回值的类型,body则是函数的具体实现。
1.捕获列表描述了lambda表达式可以访问上下文中的哪些变量。
[] :表示不捕获任何变量
[=]:表示按值捕获变量
[&]:表示按引用捕获变量
[this]:值传递捕获当前的this
[=, &x]:混合捕获 变量x以引用形式捕获,其余变量以传值形式捕获(注意顺序不能变,=符号一定要在前面)
[&, x]: 混合捕获 变量x以值的形式捕获,其余变量以引用形式捕获(注意顺序不能变,&符号一定要在前面)
上面这种捕获是不允许的,=表示按值的方式捕获所有的变量,x相当于被重复捕获了。 但是捕获列表不允许变量的重复传递:例如 [=,x]
2.params表示lambda的参数,用在{}中
3.opt表示lambda的选项,例如mutable,后面会介绍一下mutable的用法。
4.ret表示lambda的返回值,也可以显示指明返回值,lambda会自动推断返回值,但是值得注意的是只有当lambda的表达式仅有一条return语句时,自动推断才是有效的。像下面这种的表达式就需要加上返回类型。
[](double x )->double{int y = x ;return x - y;};
虽然lambda表达式是匿名函数,但是实际上也可以给lambda表达式指定一个名称,如下表示
auto f = [](int x ){return x % 3 ==0;};
此后再需要使用该lambda表达式,就可以使用f()来代替。举一个例子:
#include <iostream>
using namespace std;
int main()
{
int a = 5,b = 6;
auto f = [=]{return a+b;};//[=]按值捕获了a和b
cout << f() << endl;
return 0;
}
按值捕获和按引用捕获:
按值捕获和按引用捕获的用法通过下面这个例子来看一下。
#include <iostream>
using namespace std;
int main()
{
int a = 5;
auto f1 = [=]{return a+1;};//按值捕获a
auto f2 = [&]{return a+1;};//按引用捕获a
cout << f1() << endl;
cout << f2()<< endl;
a++;
cout << f1() << endl;
cout << f2() << endl;
return 0;
}