Lamda表达式(匿名函数)定义函数语法:
- [可访问外部变量](参数)->返回值{函数体}
- [变量名1,变量名2.....](){} 指定部分变量访问
- [=](){} 值传递形式捕获外部所有变量 (内部无法改变实际变量)
- [&](){} 引用形式捕获外部所有变量 (内部可以改变实际变量)
- [this](){} this只能捕获全局变量,类成员变量,不能捕获局部变量
- 默认情况下,lambda表达式以const来修饰函数体
- lambda表达式可以转换为函数指针,但是lambda表达式不可以捕获外部变量
- 函数指针不可以转换为lambda表达式
lambda表达式基础代码示例:
#include <iostream>
using namespace std;
void lambda_test();
int global_a = 100;
class Test
{
public:
int num1 = 1;
void func()
{
int num2 = 2;
auto t1 = [=]()
{
cout << num1 << "\t" << num2 << "\t" << global_a << endl;
};
t1();
//this只能捕获全局变量,类成员变量,不能捕获局部变量
auto t2 = [this]()
{
//cout << num1 << "\t" << num2 << endl;不可捕获局部变量
cout << num1 << "\t" << global_a << endl;
};
t2();
}
};
int main()
{
lambda_test();
Test t;
t.func();
return 0;
}
void lambda_test()
{
int data1 = 10;
int data2 = 20;
int a = 97;
int b = 98;
//-----------1、data1,data2以值传递方式给lambda表达式
auto t1 = [data1,data2]()
{
cout << data1 << "\t" << data2 << endl;
//cout << a << "\t" << b << endl;错误,捕获列表[]中只有data1,data2
};
t1();
//-----------2、x,y做为lambda表达式参数的形式存在
auto t2 = [](int x,int y)
{
cout << x << "\t" << y << endl;
};
t2(11,22);
//-----------3、=以值传递形式捕获外部所有变量 ,包含全局变量(内部无法改变实际变量)
auto t3 = [=]()
{
//a = 65;错误,内部无法改变实际变量
//b = 66;
cout << data1 << "\t" << data2 << "\t" << a << "\t" << b << endl;
};
t3();
auto t33 = [=]()mutable
{
a = 65;//正确,添加mutable修饰符可以改变实际变量
b = 66;
cout << data1 << "\t" << data2 << "\t" << a << "\t" << b <<"\t" << global_a << endl;
};
t33();
//-----------4、&以引用形式捕获外部所有变量 ,包含全局变量(内部可以改变实际变量)
auto t4 = [&]()
{
a = 65;//正确,内部可以改变实际变量
b = 66;
cout << data1 << "\t" << data2 << "\t" << a << "\t" << b << "\t" << global_a<< endl;
};
t4();
}
lambda表达式与函数指针代码示例:
#include <iostream>
using namespace std;
void lambda_test();
int global_a = 100;
int main()
{
lambda_test();
return 0;
}
void lambda_test()
{
int (*func)(int x,int y);//函数指针
//-----------lambda表达式
auto t1 = [](int data1,int data2)
{
return data1 + data2;
};
func = t1;//lambda表达式可以转换为函数指针,但是lambda表达式不可以捕获外部变量
//t1 = func;函数指针不可以转换为lambda表达式
cout << (*func)(10,20) << endl;
}