c++中的lambda特性

来源:

http://www.jb51.net/article/56147.htm

cocos2dx3.0测试:

1.有参数a,b

printf("lambda=%lf", [](float a,int b)->float { return a+b; } (-0.5,10));

结果:-0.5+10 =

c++中的lambda特性

参数a:-0.5

参数b:10

参数:->float  代表结果为float类型

参数【】:也是代表传参的

2.测试2: [=] 里面有加号,表示值传递方式捕捉所有父作用域的变量(包括this);

int d = 20;

printf("lambda=%lf", [=](float a, int b)->float { return a + b  + d; } (-0.5, 10));

结果:-0.5+10+20 =

c++中的lambda特性

总结:

1.[var]表示值传递方式捕捉变量var;
2.[=]表示值传递方式捕捉所有父作用域的变量(包括this);

3.[&var]表示引用传递捕捉变量var;

4.[&]表示引用传递方式捕捉所有父作用域的变量(包括this);
5.[this]表示值传递方式捕捉当前的this指针。

上面提到了一个父作用域,也就是包含Lambda函数的语句块,说通俗点就是包含Lambda的“{}”代码块。上面的捕捉列表还可以进行组合,例如:

1.[=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量;
2.[&,a,this]表示以值传递的方式捕捉变量a和this,引用传递方式捕捉其它所有变量。

不过值得注意的是,捕捉列表不允许变量重复传递。下面一些例子就是典型的重复,会导致编译时期的错误。例如:

3.[=,a]这里已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错的;
4.[&,&this]这里&已经以引用传递方式捕捉了所有变量,再捕捉this也是一种重复。

上一篇:分享基于分布式Http长连接框架--设计模型


下一篇:JavaScript数据结构,队列和栈