Lambda的形式是[函数对象参数](操作符重载函数参数)某种声明(例如:mutable)->返回值类型{函数体};
Lambda的调用方式有两种,一种是直接在整个Lambda表达式后面带上(),因为Lambda表达式就是函数指针,函数指针带上()就是调用,另一种是起一个别名,即使把Lambda赋值给一个变量名,通过变量名+()进行调用。
直接看它的定义时非常难懂的,简单来说[ ]里的是你可以在Lambda表达式中使用的参数,例如:你在类中使用Lambda表达式,想在Lambda中使用类的变量(包括this指针)那么你可以通过[ ]给Lambda传递。
1.空:Lambda表达式不使用在同一块语句的变量,例如:[]
2.=:在块语句内的局部变量都以值传递的方式传递给Lambda,例如:[=]
3.&:块语句内的局部变量以引用方式传递给Lambda,例如:[&]
4.指定某个变量传递,例如:[a],[&a]
注意:
值传递的方式在Lambda不能对变量做出修改,例如:[a](){函数体};在函数体中,只能访问变量a,不能对变量a做出修改。想要修改a的值可以用引用的方式传递[&a];也可以声明为mutable,例如:[a]()mutable{函数体};那么在{函数体}中可以修改a的值,但这个a是函数体的副本,不是外部的a。
#include<iostream>
#include<functional>
#include<stdlib.h>
using namespace std;
void main()
{
int a = 10;
auto f=[a]()mutable{
a++;
cout << a << endl;
};//值传递
f();//调用Lambda
cout << a << endl;
auto f2 = [&a](){
a++;
};//引用
f2();//调用Lambda
cout << a << endl;
system("pause");
}
由打印结果可以区分mutable和[&]的区别。
参数:
Lambda接收参数,参数用()传递,例如:
[ ](int a,int b){函数体};
#include<iostream>
#include<functional>
#include<stdlib.h>
using namespace std;
void main()
{
int a(10), b(20);
auto add=[](int a, int b){
cout << a + b << endl;
};
add(a, b);//传参
system("pause");
}
指定返回值类型:
Lambda表达式中{函数体}若有返回值,可以通过->返回值类型指定,例如:
#include<iostream>
#include<stdlib.h>
#include<functional>
using namespace std;
void main()
{
int a(10), b(20);
auto add=[](int a, int b)->int{//指定返回值类型
return a + b;
};
cout<<add(a, b)<<endl;
system("pause");
}