lambda表达式

c++11中的lambda表达式是一种匿名函数(即没有函数名),同时,lambda函数是也inline(内联函数)。lambda函数的语法定义为:

[capture] (parameters) mutable ->return-type {statement}

每项含义:

(1) [capture] :捕捉列表,不能省略。

它是lambda的引出符,即开始标志;编译器可以通过它来判断该函数是否为lambda函数,“捕捉列表”能够捕捉上下文中的变量以作为lambda函数使用。“捕捉列表”只能使用那些到定义lambda为止时lambda所在作用范围内可见的局部变量(包括lambda所在类的this)。
捕捉列表由0个或多个捕捉项组成,并以逗号隔开,它具有一下几种形式:
1)空。没有任何函数对象参数。
2)[var] 表示值传递方式捕捉变量var。函数体内不能修改传递过来的a的拷贝,因为默认情况下函数是const,如果需要修改,可以添加mutable修饰符。
3)[=] 表示值传递方式捕捉所有父作用域的变量(包括this)
4)[&var] 表示引用传递捕捉变量var
5)[&] 表示引用传递捕捉所有父作用域的变量(包括this)
6)[this] 表示值传递方式捕捉当前的this指针。函数体内可以使用lambda所在类中的成员函数。
7)[=, &a, &b]表示除a,b按引用传递外,其他参数都按值进行传递

例子

#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 a+b;
   };

   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]

//“捕捉列表”由3项组成。以引用传递的方式捕捉变量a、b,以值传递的方式捕捉变量c。因此在lambda表达式的函数体中修改了变量a和b之后,父作用域中的a、b值也改变。
// 即使是在lambda函数内部修改了变量c的值,父作用域中的c仍然不会受到影响,因为是值传递的方式。(需在参数列表后面加上mutable关键字(修饰符))。

(2)(parameters):参数列表

和C/C++中的普通函数参数意义一样。该部分是可选的,如果我们不需要进行参数传递时,可以连同括号“()”一起省略掉。

(3)mutable/exception声明:可以省略。

按值传递函数对象参数时,加上mutable修饰符后,可以修改传递进来的拷贝(注意是能修改拷贝,而不是
值本身)。exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)。

(4)->return-type: 函数的返回值类型。

和C/C++中的普通函数返回值类型的性质一样。主要目的是用来追踪lambda函数(有返回值情况下)的返回类型。若lambda函数不需要返回值,则可以直接将这部分省略掉。

(5)-{statement}: 函数体。

在该函数体中,除了可以使用参数列表中的变量外,还可以使用所有捕获到的变量(即[capture] 中的变量)。

原文链接: https://www.cnblogs.com/vivian187/p/12698345.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    lambda表达式

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/397168

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月7日 上午9:18
下一篇 2023年4月7日 上午9:18

相关推荐