今天,我们来看看c++中的高阶语法——匿名函数Lambda函数,也叫Lambda表达式。下面我们一一来看看这个Lambda函数吧。
1.匿名函数就是没有名字的函数。有一些函数只是临时用一下,而且业务逻辑也比较的简单,相当于是临时工,就没必要给它定义成一个正常函数(包含有函数名,很正式的那种)。使用临时的匿名函数,可以减轻函数的数量,让代码变的清晰易读。
2.Lambda表达式具体形式如下:[capture](parameters)->return-type{body}
如:[](int x, int y) -> int { int z = x + y; return z; }
[ ]是指闭包,闭包是指在Lambda函数之外声明的变量,Lambda函数可以引用这些变量,这些变量的集合叫做闭包。在[ ]里面可以定义变量是按值或这引用来捕获。捕获的含义就是:按照什么类型来获取的变量。即使没有引用外部变量,也不能省略。
( )是指Lambda函数中用到的参数,这些参数是Lambda函数自己定义的局部变量。没有自定义的参数,可以省略。
return-type:是值Lambda函数运行完后,返回值的类型。如果没有返回值,可省略不写。
{body}:Lambda函数操作主体。
如果没有参数,空的圆括号()可以省略.返回值也可以省略,如果函数体只由一条return语句组成或返回类型为void的话.形如:[capture](parameters){body}.注意【】不能省略。
例子:[](int x, int y) { return x + y; } // 隐式返回类型
[](int& x) { ++x; } // 没有return语句 -> lambda 函数的返回类型是'void'
[]() { ++global_x; } // 没有参数,仅访问某个全局变量
[]{ ++global_x; } // 与上一个相同,省略了()
std::for_each(begin(some_list), end(some_list), [&total](int x) {total += x;});
注意:不同编译器的具体实现可以有所不同,但期望的结果是:按引用捕获的任何变量,lambda函数实际存储的应该是这些变量在创建这个lambda函数的函数的栈指针,而不是lambda函数本身栈变量的引用. 不管怎样, 因为大数lambda函数都很小且在局部作用中, 与候选的内联函数很类似, 所以按引用捕获的那些变量不需要额外的存储空间.
lambda函数是一个依赖于实现的函数对象类型,这个类型的名字只有编译器知道. 如果用户想把lambda函数做为一个参数来传递, 那么形参的类型必须是模板类型或者必须能创建一个std::function类似的对象去捕获lambda函数.使用 auto关键字可以帮助存储lambda函数,
auto my_lambda_func = [&](int x) { /*...*/ };
auto my_onheap_lambda_func = new auto([=](int x) { /*...*/ });
很多程序员在平常写c++代码,也很喜欢用lambda这种匿名函数,就是图它写法简单,比较方便。所以还是建议大家能用就用吧。
好啦,关于lambda这个匿名函数的分享就到这啦。
本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.