lambda表达式的语法定义如下:
[capture] (parameters) mutable ->return-type {statement};
参数解释:
[capture]: 捕捉列表。
捕捉列表总是出现在lambda函数的开始处。实质上,[]是lambda引出符(即独特的标志符)
编译器根据该引出符判断接下来的代码是否是lambda函数
捕捉列表能够捕捉上下文中的变量以供lambda函数使用
捕捉列表由一个或多个捕捉项组成,并以逗号分隔,捕捉列表一般有以下几种形式:
-
[var] 表示值传递方式捕捉变量var
-
[=] 表示值传递方式捕捉所有父作用域的变量(包括this指针)
-
[&var] 表示引用传递捕捉变量var
-
[&] 表示引用传递捕捉所有父作用域的变量(包括this指针)
-
[this] 表示值传递方式捕捉当前的this指针
-
[=,&a,&b] 表示以引用传递的方式捕捉变量 a 和 b,而以值传递方式捕捉其他所有的变量
-
[&,a,this] 表示以值传递的方式捕捉 a 和 this,而以引用传递方式捕捉其他所有变量
注意:捕捉列表不允许变量重复传递
(parameters):参数列表。
与普通函数的参数列表一致。如果不需要参数传递,则可以连同括号()一起省略
mutable : mutable修饰符。
默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性(下面代码中有讲解)
注意:在使用该修饰符时,参数列表不可省略(即使参数为空)
->return-type : 返回类型。
用追踪返回类型形式声明函数的返回类型。不需要返回值的时候也可以连同符号->一起省略
{statement} : 函数体。
内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量
代码示例
-
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
int a = 3;
int b = 2;
auto f1 = [](int a, int b)->int{return a + b; };
int add = f1(a, b);
cout << "add :"<
//捕获父作用a、b变量的值
auto f2 = [=]{return a - b; };
int subtract = f2();
cout << "subtract: " << subtract << endl;
//父作用域中a传入lambda中具有了const属性,不能修改它的值,mutabl取消了a的const特性
auto f3 = [=]()mutable{a = 4; return a * b; };
int multiply = f3();
cout << "multiply" << multiply << endl;
//lambda与stl
vector vec;
for (int i = 1; i <=10; i++)
{
vec.push_back(i);
}
-
for_each(vec.begin(), vec.end(), [](int ver){cout << ver;});
cout << endl;
-
-
//虽然上面的形式已经简洁了很多,不过我还是觉得下面的更简洁
for (auto i : vec) {cout << i << endl;}
-
system("pause");
return 0;
}
阅读(953) | 评论(0) | 转发(0) |