在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]
按照值,按照引用, 一个可以修改,可以不可以修改,这个感觉本身上语法就有一些矛盾,
大家看的挑选对自己有用的就行,不用刻意取较劲,