C++11 Lambda函数

网友投稿 516 2022-10-24

C++11 Lambda函数

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)<int {a += x; b += y; return a + b; }; int t = fun4(10, 20); cout << t << endl; //42 cout << a <<" "<< b << endl; //5 7 return 0;}

特别注意

块作用域以外的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小时内删除侵权内容。

上一篇:ASP.NET Core是一个跨平台的.NET框架
下一篇:php-msf- 基于 Swoole 的 PHP 微服务框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~