小游戏平台搭建如何推动创新与用户体验的双重提升
502
2022-10-24
C++11 Lambda函数
C++11 Lambda函数
格式如下:
[捕捉列表] (参数) mutable -> 返回值类型 {函数体}
捕捉列表
[]是lambda的引出符,捕捉列表能够捕捉上下文中的变量,来供lambda函数使用:
[var] 表示以值传递的方式捕捉变量var[=] 表示以值传递的方式捕捉所有父作用域变量[&var] 表示以引用传递的方式捕捉变量var[&] 表示以引用传递的方式捕捉所有父作用域变量[this] 表示以值传递的方式捕捉当前的this指针[=,&a] 表示以值传递的方式捕捉其他变量,以引用传递的方式捕捉a
注意: 捕捉列表不允许变量重复传递,如:[=,a]、[&,&this],会引起编译阶段的错误。
参数列表与普通函数的参数列表一致。如果不需要传递参数,可以省略掉括号“()”。
mutable
可以取消Lambda的常量属性。因为Lambda默认是const属性;multable仅仅是让Lamdba函数体修改值传递的变量,但是修改后并不会影响外部的变量。
->
表示返回类型。如果是void时,可以省略“->”,如果返回类型很明确,也可以省略“->”,因为编译器会自动推导类型。
函数体
函数体和普通函数一样,除了可以使用参数之外,还可以使用捕获的变量。
最简单的Lambda函数
[]{}
接受参数
auto total = [](int x, int y)->int {return x + y; };
以值传递的方式捕获父作用域变量
auto fun1 = [=] {return a + b; };
以引用方式捕获父作用域变量,省略返回值类型
auto fun2 = [&](int c) {b = a + c; a = 1; };
以值传递的方式捕获父作用域变量,以引用传递的方式捕捉b。Lambda默认是const属性,加mutaple,就可以在函数体里修改。
auto fun3 = [=, &b](int c) mutable {b = a + c; a = 1; };
综合
int main(int argc, char* argv[]){ int a = 5, b = 7; // 接受参数 auto total = [](int x, int y)->int {return x + y; }; cout << total(a, b)<
特别注意
块作用域以外的Lambda函数捕捉列表必须为空,块作用域以内的Lambda函数仅能捕捉块作用域以内的自动变量,捕捉任何非此作用域或非自动变量(静态变量),都会引起编译器报错。如:
Scene* MultiTouchScene::create() { return scene;}// 以下是错误的,捕捉列表必须为空auto fun = [=]{};// 正确auto fun1 = []{};bool MultiTouchScene::init() {}
否则会报如下错误:
: non-local lambda expression cannot have a capture-defaultauto fun = [=]{}; ^
谢谢阅读
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~