1. lambda表达式概述
概述:lambda表达式也叫匿名函数,是在调用或作为函数参数传递的位置处定义匿名函数对象的便捷方法。需要使用 [] 来进行定义与使用
2. lambda参数列表
- [] 表示不捕获任何变量
void func() {//[]不捕获任何变量 auto function = ([] { cout << "Hello world" << endl; }); function();//调用需要像函数一样调用 }
-
[n] 表示值传递方式捕获变量n
void func1() {//[n] 捕获变量n int num = 100; auto function = ([num] { cout << num << endl; }); function(); }
-
[=] 表示值传递方式捕获所有父作用域的变量
void func2() {//[=] 值传递的方式捕获所有父作用域的标量(包括this) int index = 1; int num = 100; auto function = ([=] { cout << "index:" << index << " " << "num:" << num << endl; }); function(); }
-
[&n] 表示引用传递捕获变量n
void func3() {//[&n] 引用传递捕获n,可以对变量进行更改 int num = 100; auto function = ([&num] { num = 1000; cout << "num:" << num << endl; }); function(); }
-
[&] 表示引用传递捕获父作用域的所有变量
void func4() {//[&] 使用引用传递的方式捕捉所有父作用域的变量(包括this) int a = 1; string b = "asd"; auto function = ([&] { a = 20; b = "bbb"; cout << "a:" << a << " " << "b:" << b << endl; }); function(); }
-
[this] 表示值传递方式捕获当前的this指针
class Lambda { public: void sayhello() { cout << "hello" << endl; } void lam() { auto function = ([this] { this->sayhello(); }); function(); } }; void func5() {//[this] 值传递方式捕捉当前this指针 Lambda l; l.lam(); }
-
[=,&] 表示拷贝和引用同时使用
void func6() {//[=,&,&] 拷贝和引用的混合使用 int a = 1; string b = "asd"; auto function = ([=, &a, &b] { cout << "a: " << a << " " << "b: " << b << endl; a = 20; b = "aoi"; cout << "a: " << a << " " << "b: " << b << endl; }); function(); }
注意:1.[=,n] 这里已经以值传递方式捕获所有变量,在重复捕获n变量,会报错
2.[&, &this] &已经以引用传递的方式捕获了所有变量,在捕获this也是重复
3. lambda参数列表
lambda表达式是可以接受参数传递的,传递的形式类似于函数
void func7()
{//lambda表达式可以接受输入参数列表,类似与函数的参数列表
auto function = [](int a, int b)
{
return a + b;
};
cout << function(100, 100) << endl;
}
4.可变规格mutable
mutable修饰符,默认情况下lambda函数是一个const函数,mutable可以取消其常量性,在使用该修饰符时,参数列表不可省略
void func9()
{//mutable作为一个修饰符,默认情况下Lambda函数总是一个const函数,mutable可以取消其常量性,使用该修饰符,
//参数列表不可省略
int a = 2;
int b = 0;
[&, a](int n) mutable {
b = a + n;
}(4);//(4)参数传递
cout << "func9:" << b << endl;
}