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 = 

 

参数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 =  

 总结:

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也是一种重复。

posted @ 2017-01-03 16:33  睡了面包  阅读(500)  评论(0)    收藏  举报