总结:
1、lambda表达式的捕获类型见下详述。
2、返回类型(可以自动推导、可以省略)。
3、捕获的参数可以在函数体中使用。
1、基础概念:
C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式。lambda表达式实质上是创建一个匿名函数/对象。
2、用法介绍:
Lambda(匿名函数)的基本语法:
auto func = [capture] (params) opt -> ret { func_body; };
其中func是可以当作lambda表达式的名字,作为一个函数使用,capture是捕获列表,params是参数表,opt是函数选项(mutable之类),ret是返回值类型,func_body是函数体。c++11允许省略表达式的返回值定义。
例子:
auto func1 = [&](int x, int y)->int { return x+y; };
2.1、捕获的具体用法:
lambda表达式允许捕获[capture]一定范围内的变量:
- []不捕获任何变量
- [&]引用捕获,捕获外部作用域所有变量,在函数体内当作引用使用
- [=]值捕获,捕获外部作用域所有变量,并拷贝一份在函数体中使用
- [=, &a]按引用捕获a变量,其余变量按值捕
- [a]只值捕获a变量,不捕获其它变量
- [this]捕获当前类中的this指针,使lambda表达式拥有与类成员函数同样的访问权限
2.2、返回类型(可以自动推导、可以省略):
auto fun = [](int x, int y)->int {cout << x + y << endl; return y;};
对于这里的==->int 这个int就是返回值类型==,如果有返回值类型需要在前面加上->
直接省略写成这种格式也可以:[](int x,int y){cout<<x+y<<endl;return y;}
2.3、函数体:
lambda表达式的函数体中可以使用捕获的参数。
3、常见用法:
std::sort(vec.begin(), vec.end(), [](const A &left, const A &right) { return left.a < right.a; });
std::vector<uint16_t> aa{1,2,3,4,5};
std::string s;
for_each(aa.begin(),aa.end(),[&s](auto each){s+=to_string(each) + ',';});
参考资料:
1、基本概念介绍:C++lambda表达式
2、用法例子:c++11新特性之std::function和lambda表达式
版权声明:本文为qq_33726635原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。