在c++11标准中引入了lambda表达式,一般用于定义匿名函数
[],[=] ,[&],[this] 都是捕获列表
[] 的作用: 什么也不捕获
[=] 的作用: 按值捕获所有变量
[&] 的作用: 引用捕获所有外部作用域内的变量
[this]的作用:
捕获当前对象成员(类内Lambda)
1 [] 的demo
#include <iostream>
#include <string>
using namespace std;
int main() {
// int a = 10;
auto func =[](int b, int c){
return b + c;
};
// 或者
// auto func =[](int b, int c)-> int {cout<<"b+c = "<<b+c <<endl;};
cout<<func(20,30)<<endl;
return 0;
}
[] 是不能引用局部变量的如下
2 [=] 的demo
Lambda内部会创建外部变量的一个副本。对这些按值捕获的变量进行修改时,只会改变其副本的值,不会影响到原始的外部变量。使用 [=]
不能直接修改局部变量的原始值。
demo
#include <iostream>
#include <string>
using namespace std;
int main() {
int a = 10;
int b = 20;
auto func =[=]{
// ++a;
cout<< "a = "<< a <<",b ="<< b<<endl;
};
func();
// cout<< "a = "<<a<<",b ="<<b<<endl;
return 0;
}
如果把修改局部变量的++a 放开是会报错的
[&]
表示按引用捕获 可以修改局部变量
Lambda 内部将获得一个指向外部变量的引用,所以对这些按引用捕获的变量进行修改时,会影响到原始的外部变量。因此,使用 [&]
可以直接修改局部变量的原始值。
#include <iostream>
#include <string>
using namespace std;
int main() {
int a = 10;
int b = 20;
auto func =[&]{
++a;
cout<< "a = "<< a <<",b ="<< b<<endl;
};
func();
return 0;
}
总结
int a = 10;
auto lambda1 = [=]{ ++a; }; // 错误:尝试修改按值捕获的常量左值 'a'
auto lambda2 = [&]{ ++a; }; // 正确:按引用捕获,可以修改外部作用域中的 'a' 的值
[this] 捕获当前对象
#include <iostream>
#include <string>
using namespace std;
class Func{
public:
int x;
Func(int val) : x(val) {}
void doSomething(){
auto lambda = [this]{ // 捕获this指针以访问成员变量x
++x;
std::cout << "Inside lambda: x=" << x << std::endl;
};
lambda();
}
};
int main() {
Func func(10);
func.doSomething();
std::cout << "Outside lambda: obj.x=" << func.x << std::endl; // 对象成员x的值已改变
return 0;
}
写这个博客主要是回顾知识的时候看到有些人记录这些组合 比如:[=, &a]
按照值,按照引用, 一个可以修改,可以不可以修改,这个感觉本身上语法就有一些矛盾,
大家看的挑选对自己有用的就行,不用刻意取较劲,