首页 > 代码库 > C++ lambda函数

C++ lambda函数

【1】lambda表达式语法定义

  lambda表达式的语法定义如下:

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

  (1) [capture]: 捕捉列表。捕捉列表总是出现在lambda函数的开始处。实质上,[]是lambda引出符(即独特的标志符)

  编译器根据该引出符判断接下来的代码是否是lambda函数

  捕捉列表能够捕捉上下文中的变量以供lambda函数使用

  捕捉列表由多个捕捉项组成,并以逗号分隔,捕捉列表一般有以下几种形式:

  <1> [var] 表示值传递方式捕捉变量var

  <2> [=] 表示值传递方式捕捉所有父作用域的变量(包括this指针)

  <3> [&var] 表示引用传递捕捉变量var

  <4> [&] 表示引用传递捕捉所有父作用域的变量(包括this指针)

  <5> [this] 表示值传递方式捕捉当前的this指针

  <6> [=,&a,&b] 表示以引用传递的方式捕捉变量 a 和 b,而以值传递方式捕捉其他所有的变量

  <7> [&,a,this] 表示以值传递的方式捕捉 a 和 this,而以引用传递方式捕捉其他所有变量

  备注:父作用域是指包含lambda函数的语句块

  另外,需要注意的是,捕捉列表不允许变量重复传递。下面的例子就是典型的重复,会导致编译错误:

  [=, a] 这里 = 已经以值传递方式捕捉了所有的变量,那么再捕捉 a 属于重复

  [&,&this] 这里 & 已经以引用传递方式捕捉了所有变量,那么再捕捉 this 属于重复

  (2)(parameters):参数列表。与普通函数的参数列表一致。如果不需要参数传递,则可以连同括号()一起省略

  (3)mutable : mutable修饰符。默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性

  在使用该修饰符时,参数列表不可省略(即使参数为空)

  (4)->return-type : 返回类型。用追踪返回类型形式声明函数的返回类型。

  出于方便,不需要返回值的时候也可以连同符号->一起省略

  此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导

  (5){statement} : 函数体。内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量

  在lambda函数的定义中,参数列表和返回类型都是可选的部分,而捕捉列表和函数体都可能为空

  那么,在极端情况下,C++11中最为简单的lambda函数只需要声明为:

  []{};

  就可以了。不过显然,这样的lambda函数不能做任何事情。

【2】lambda函数示例代码

  示例代码1:

 1 #include <iostream> 2 using namespace std; 3  4 void main() 5 { 6     int a = 20, b = 10; 7  8     auto totalAB = [] (int x, int y)->int{ return x + y; }; 9     int aAddb = totalAB(a, b);10     cout << "aAddb :" << aAddb << endl;11 12     auto totalAB2 = [a, &b]()->int{ return a + b; };13     int aAddb2 = totalAB2();14     cout << "aAddb2 :" << aAddb2 << endl;15 16     auto totalAB3 = [=]()->int{ return a + b; };17     int aAddb3 = totalAB3();18     cout << "aAddb3 :" << aAddb3 << endl;19 20     []{}; // 最简lambda函数21     [=] { return a + b; }; // 省略了参数列表与返回类型,返回类型由编译器推断为int22     auto fun1 = [&] (int c) { b = a + c; }; // 省略了返回类型,无返回值23     auto fun2 = [=, &b](int c)->int { return b += a + c; }; // 各部分都很完整的lambda函数24     cout << "fun2(100) :" << fun2(100) << endl;25 }26 // Result:27 /*28 aAddb :3029 aAddb2 :3030 aAddb3 :3031 fun2(100) :13032 */

  以上代码仅供学习参考

【3】lambda函数总结

  函数的使用

Good  Good  Study,  Day  Day  Up.

C++ lambda函数