ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c++11:Lambda表达式

2021-12-26 18:33:13  阅读:137  来源: 互联网

标签:11 函数 int list c++ 传递 表达式 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表达式 - 滴水瓦 - 博客园

标签:11,函数,int,list,c++,传递,表达式,Lambda
来源: https://blog.csdn.net/wwwlyj123321/article/details/122157345

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有