c++11:Lambda表达式

C++11中的Lambda表达式用于定义并创建匿名的函数对象(匿名函数就是没有函数名,以简化编程工作。

Lambda表达式完整的声明格式如下:

[capture list] (params list) mutable exception-> return type { function body }

Lambda表达式完整的调用格式如下:

[capture list] (params list) mutable exception-> return type { function body }(input params list);

各项具体含义如下

  1. capture list:捕获外部变量列表
  2. params list:形参列表
  3. mutable指示符:用来说用是否可以修改捕获的变量(可以省略)
  4. exception:异常设定(可以省略)
  5. return type:返回类型(无返回值可以不写)
  6. function body:函数体
  7. input params list,用在函数调用的时候输入参数,和形参列表对应

capture list详解:

Lambda表达式可以使用其可见范围内的外部局部变量(全局变量本来就可以访问,所以没必要特殊说明),但必须在capture list中明确声明。capture list有以下形式:

  1. 空。表示不能访问任何表达式外的局部变量。
  2. =。这种是最常用的方式。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。
  3. &。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。
  4. this。函数体内可以使用Lambda所在类中的成员变量。
  5. a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
  6. &a。将a按引用进行传递。
  7. a, &b。将a按值进行传递,b按引用进行传递。
  8. =,&a, &b。除a和b按引用进行传递外,其他参数都按值进行传递。
  9. &, a, b。除a和b按值进行传递外,其他参数都按引用进行传递。

示例1:例如定义打印一个整型参数的匿名函数可以这样编写和调用:

// []为空表示不接受任何外部变量
// (int x)表示函数的形参x,输入一个整形变量
// (9)表示调用匿名函数,并输入参数9


[](int x){std::cout<<x<<std::endl;}(9);

示例2:比较两个整数,返回最大值

int maxXY = 0;
maxXY = [](int x, int y)->int{if(x>y){return x;}else{return y;}}(23,172);
std::cout<<"max:"<<maxXY<<std::endl;

示例3:将比较两个整数,返回最小值,采用捕获表达式值传递的方式

int x = 36, y = 13;
int minXY = 0;
minXY = [x, y]()->int{if(x<y){return x;}else{return y;}}();
std::cout<<"minXY:"<<minXY<<std::endl;

示例4:如果想在在匿名函数中改变变量x,y的值,可以在捕获时用引用的方式[&x, &y]:

int x = 36, y = 13;
int minXY = 0;
minXY = [&x, &y]()->int{x=21;y=58;if(x<y){return x;}else{return y;}}();
std::cout<<"minXY:"<<minXY<<std::endl;
std::cout<<"x:"<<x<<std::endl;
std::cout<<"y:"<<y<<std::endl;

输出结果:

minXY:21

x:21

y:58

示例5:默认情况下,用赋值方式捕获的外部变量在匿名函数里的拷贝是不允许修改的,如果想在匿名函数里修改它们的值,需要在函数体大括号前使用关键字mutable

注意,这种方式与直接使用引用方式捕获不同,它并不会改变外部变量实际的值。

int x = 36, y = 13;
int minXY = 0;
minXY = [x, y]()mutable{x=21;y=58;if(x<y){return x;}else{return y;}}();
std::cout<<"minXY:"<<minXY<<std::endl;
std::cout<<"x:"<<x<<std::endl;
std::cout<<"y:"<<y<<std::endl;

输出结果:

minXY:21

x:36

y:13

ref:

C++编程基础: 18. Lambda表达式

C++ 11 Lambda表达式 - 滴水瓦 - 博客园

上一篇:KoaHub.JS基于Node.js开发的处理和显示日期代码


下一篇:linux系统异常关机导致报文件系统只读Read-only file system的解决方法