网站宣传方案高端网站定制站
网站宣传方案,高端网站定制站,wordpress主题太臃肿,免费网页申请1. lambda 函数概述lambda 表达式是一种匿名函数#xff0c;即没有函数名的函数#xff1b;该匿名函数是由数学中的λ演算而来的。通常情况下#xff0c;lambda函数的语法定义为#xff1a;[capture] (parameters) mutable -return-type {statement}其中#xff1a;[c…1. lambda 函数概述 lambda 表达式是一种匿名函数即没有函数名的函数该匿名函数是由数学中的λ演算而来的。通常情况下lambda函数的语法定义为[capture] (parameters) mutable -return-type {statement}其中[capture] 捕捉列表。捕捉列表总是作为lambda的开始即出现于lambda的开始处。它是lambda的引出符即开始标志。编译器可以根据该“标志”来作出判断出该函数是否为lambda函数。同时“捕捉列表”能够捕捉上下文中的变量以作为lambda函数使用。(parameters)参数列表。和C/C中的普通函数参数意义一样。该部分是可选的意味着如果我们不需要进行参数传递时可以连同括号“”一起省略掉。mutable该关键字为一个修饰符。在默认的情况下lambda函数总是返回一个const而当我们在参数列表后面注明了“mutable”关键字之后则可以取消其常量性质。若在lambda中使用了mutable修饰符则“参数列表”是不可省略掉的即使是参数为空。-return-type 函数的返回值类型。和C/C中的普通函数返回值类型的性质一样。主要目的是用来追踪lambda函数有返回值情况下的返回类型。若lambda函数不需要返回值则可以直接将这部分省略掉。{statement}函数体。在该函数体中除了可以使用参数列表中的变量外还可以使用所有捕获到的变量即[capture] 中的变量。见下图1.1. lambda 函数中“捕捉列表”详解C11中的lambda函数其中的“捕捉列表”是由0个或多个“捕捉项”组成并以逗号“”分隔。捕捉列表有如下几种形式1[var] 表示值传递方式捕捉变量var。#include iostream
#include string
#include stdio.h
using namespace std;
int main()
{int a 1,b 2, c 3;auto retVal [,a,b](){printf(inner c[%d]n,c);a 10;b 20;return ab;};printf(sum[%d]n,retVal());printf(a[%d] b[%d] c[%d]n,a,b,c);return 0;
}打印结果
inner c[3]
sum[30]
a[10] b[20] c[3]
上面的代码中“捕捉列表”由3项组成。以引用传递的方式捕捉变量a、b以值传递的方式捕捉变量c。因此在lambda表达式的函数体中修改了变量a和b之后父作用域中的a、b值也改变。而即使是在lambda函数内部修改了变量c的值父作用域中的c仍然不会受到影响因为是值传递的方式。需在参数列表后面加上 mutable 关键字修饰符。同时#include iostream
#include string
#include stdio.h
using namespace std;
int main()
{int a 1,b 2, c 3;auto retVal [,a,b]() mutable-int{printf(inner c[%d]n,c);a 10;b 20;c 30;printf(inner c2[%d]n,c);return ab;};printf(sum[%d]n,retVal());printf(a[%d] b[%d] c[%d]n,a,b,c);return 0;
}打印结果
inner c[3]
inner c2[30]
sum[30]
a[10] b[20] c[3]
2[] 表示值传递方式捕捉所有父作用域的变量包括this。3[var] 表示引用传递捕捉变量var。4[] 表示引用传递捕捉所有父作用域的比哪里2020-02-18 09:36:12 修改 的变量包括this。#include iostream
#include string
#include stdio.h
using namespace std;
int main()
{int a 1,b 2, c 3;auto retVal []() mutable-int{printf(inner a[%d] b[%d] c[%d]n,a,b,c);a 10;b 20;c 30;return ab;};printf(sum[%d]n,retVal());printf(a[%d] b[%d] c[%d]n,a,b,c);return 0;
}打印结果
inner a[1] b[2] c[3]
sum[30]
a[10] b[20] c[30]
5[this] 表示值传递方式捕捉当前的this指针。同理(2),(3),(5)可以参考上面的两个例子。2. lambda 函数特点(1)在C11中lambda函数是inline内联函数。3. lambda 函数使用代码一#include iostream
#include string
#include stdio.h
using namespace std;
int main()
{int a 6;int b 8;auto sum [](int a,int b) -int{return a b;};printf(sum[%d]n,sum(a,b));return 0;
}//打印结果sum[14]
在代码一中定义了一个简单的lambda函数该函数的函数列表能够接收两个int类型的数据而且返回值为int类型。注意lambda函数中参数列表和返回类型都是可选的部分而且捕捉列表和函数也可以为空。因此在某种情况下C11中的简略版本的lambda函数可以是这样的// 完整语法
[ capture-list ] ( params ) mutable(optional) constexpr(optional)(c17) exception attribute - ret { body } // 可选的简化语法
[ capture-list ] ( params ) - ret { body }
[ capture-list ] ( params ) { body }
最为简洁的版本如下, 多谢读者「-兮」 的指正。已将[]()修改为了[]{}[ capture-list ] { body }
代码二在C开发中4. lambda 函数与 STL更多技术干货见个人微信公众号 雅俗不共赏 扫码关注不迷路~http://weixin.qq.com/r/NhIjOz-EnWLirXtY90ck (二维码自动识别)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91115.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!