- 什么是lambda表达式?
答:来我们看看百度怎么说?Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示团包(注意和数学传统意义上的不同)。lambda是C++11中的一大亮点,但是他也不是只有C++中有啊,比他更早的Python等高级语言中都有lambda表达式。该表达式的特点就是简洁,他可以在函数中去定义另外一个匿名函数,并且还可以直接把他给调用起来。这就很方便了。使得程序非常的简洁高效灵活。 - lambda表达式的语法
[capture list](parans list) opt-> return {body;}; capture:捕获列表 parans:参数列表 opt:函数选项,该部分我们可以省略掉 return:返回值类型,也可省略 body:函数体 - 我们需要把它写道函数的内部才行,基于该函数原型,写实例demo如下:该函数是放在一个构造函数的内部定义并执行的,我们先不管构造函数,抓重点:函数内部; 这个函数中我们省略了捕获对象,参数列表,函数返回值; 由于这个匿名函数没有名字,所以函数的调用也就只需要将匿名函数的申明再写一遍即可; 函数的定义部分的结尾有一对括号,该括号的作用是里边写参数列表的,但是由于我们没有参数,所以空放在这即可。
- 捕获外部变量
捕获外部变量就是在构造函数的内部,匿名函数的外部完成的;就是捕获到匿名函数外面的局部变量并在匿名函数的内部用它。 要想使用捕获的方法就必须要知道捕获列表,下面就是捕获列表:
[] ----------------》沒有定义任何变量。使用未定义变量会引发错误,也就是不能使用任何匿名函数体外部的变量,否则会出错; 如果要使用外部变量,而且是不加任何限制的使用,怎么办?有两种方式:
[&]--------------》 任何被使用到的外部变量都隐式地以引用方式加以引用(按引用捕获);
[=]--------------》任何被使用到的外部变量都隐式地以传值方式加以引用(按值捕获); 作为副本在函数体内进行使用,拷贝的副本在匿名函数体内部是只读的;
[x, &y]----------》 x以传值方式传入(默认),y以引用方式传入; 只有y是以引用的方式传递进来的,除此之外的其他变量是以值拷贝的方式传入的;
[&]--------------》 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=]--------------》任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x]------ ----》 x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z]---- ----》z显式地以引用方式加以引用。其余变量以传值方式加以引用。
- 以下所有的代码都是在匿名函数的外部定义三个变量
- 以引用的方式捕获外部数据:
- 以值拷贝的方式捕获外部数据:我们直接把&换成=的话,这样是会报错的,因为我们的值拷贝进来的数据是只读,我们,因此,我们需要使用mutable关键字修饰,把这个关键字放在opt这个位置。 这里opt处的关键字除了mutable之外还有其他,比如抛出异常之类的,有用到了可以再查,一般mutable就够了。
- 带形参列表的以值拷贝的方式捕获外部数据:匿名函数:[capture list](parans list) opt-> return {body;}; params list是形参表;
- 匿名函数的返回值:
匿名函数:[capture list](parans list) opt-> return {body;}; -> return:表示返回值,默认“return"这个地方是不需要我们指定返回值类型的,因为编译器会自动帮我们推到出来返回值得类型,有一种情况是我们需要去指定返回值的类型的,那就是匿名函数内部使用多次的return后需要指定返回值的类型。