• 什么是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后需要指定返回值的类型。 ​