点击上方“蓝字”,发现更多精彩。本文在前一篇关于函数对象、bind 函数的基础上,对 C++ 中 lambda不表达式的使用进行总结。lambda01PART定义一个 lambda 表达式表示一个可调用的代码单元,可以理解为是一个未命名的内敛函数。类似任何函数,一个 lambda 具有返回类型、参数列表和函数体;和普通函数不同, lambda 必须使用尾置返回来指定返回类型。

①.捕获列表捕获列表是一个 lambda 所在函数中定义的局部变量的列表,捕获列表能够捕捉上下文中的变量以供 lambda 使用。捕获列表可以为空,但 [] 不可以省略,编译器依次来判断接下来的代码是否是 lambda 表达式。②.参数列表和普通函数的参数列表一致,如果不需要参数传递,则可以连同括号 () 一起省略。lambda 中参数不能有缺省值,也不能有无名参数。③.mutable默认情况下,对于一个值被拷贝的变量,lambda 不会改变其值,加上 mutable 修饰符后,可以修改传递进来的拷贝。在使用 mutable 修饰符时,参数列表部分不可省略,但列表可以为空。④.返回类型标识函数返回值的类型,当返回值为 void,或者函数体中只有一处 return 时可用省略。⑤.函数体标识函数的实现,内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。函数体不能省略,但函数体可以为空。02PART捕获列表

①.概念

一个 lambda 通过将局部变量包含在其捕获列表中来指定将会使用这些变量,只能使用明确指明的变量;变量捕获方式可以传值捕获,也可以传引用捕获。

②.按值捕获变量

在捕获列表中指定变量名字,类似传值的参数,被捕获的变量值将在 lambda 创建时被拷贝。

③.按引用捕获变量

用 & 引用捕获,一个以引用方式捕获的变量,在 lambda 中被使用时,实际上使用的引用所绑定的对象。

④.多参数捕获

捕获列表中可以指定捕获多个参数,并且可以为每个参数指定捕获方式。

⑤.隐式按值捕获

使用 [=] 表示按值捕获 lambda 所在范围内所有可见的局部变量。

⑥.隐式按引用捕获

使用 [&] 表示按引用方式捕获 lambda 所在范围内所有可见的局部变量。

⑦.隐式混和捕获

使用 [=,prams] 表示除 xxx 按引用捕获外,其他所有参数按值捕获;使用 [&,prams]  表示除 xxx 按值捕获外,其他所有参数按引用捕获。

04PART指定返回类型

如果一个 lambda 函数体包含了 return 之外的任何语句,则编译器假定返回类型为 void,此时我们必须指定返回值类型。

05PARTlambda 是函数对象

定义一个 lambda ,编译器会生成一个与 lambda 对应的新的类类型。当向一个函数传递一个 lambda 时,同时定义了一个新类型和该类型的一个对象,生成的类包含所捕获变量对应的数据成员,数据成员在类创建时被初始化。

int sum = 0;std::vector<int> vec = { 1,2,3,4,5 };std::for_each(begin(vec), end(vec), [&sum](int x){sum += x;});

上述代码被编译器翻译后变为:

class lambda_b{private:    int* m_pSum;public:    lambda_b(int* pSum)    {        m_pSum = pSum;    }    void operator()(int x) const {        *m_pSum += x;    }};int sum = 0;std::vector<int> vec = { 1,2,3,4,5 };std::for_each(begin(arry), end(arry), lambda_b(&sum));

06PARTlambda 使用

lambda 表达式实际为一个函数对象,可以把匿名函数保存在变量当有名函数来使用。

①.使用 auto 保存

int a = 1;int b = 2;//使用 auto 保存 lambda auto func = [a, &b](int c)mutable ->int { b = a + c; return a; };//做有名函数使用  cout << b << "  "<< func(10) << endl;

②.函数指针保存

当 lambda 的捕获外部变量列表为空时,可使用普通函数指针来保存。

//使用函数指针保存 lambda int(*func1)(int) = [](int x) {return x; };//函数调用int a = func1(20);

③.使用 std::function 模板类型

#include std::function<float(int,float)> fun1 = [](int x, float y) { return x + y; };float a = fun1(12,1.2);//函数调用

函数对象C++ 可调用对象(一)

扫码关注持续获取最新文章c++学习 算法与数据结构

pb通过对象名称调用对象_C++ 可调用对象(二)相关推荐

  1. pb通过对象名称调用对象_域服务是命名空间,利用AD DS,通过对象名称可找到相关所有信息...

    今天介绍域服务是一个命名空间,Windows Server 2012 R2如何启动Netlogon服务.小伙伴们可能不一定了解,命名空间(Namespace)是一个界定好的区域(Bounded Are ...

  2. python类的构造方法名称_搞懂Python的类和对象名称空间

    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间:文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层函 ...

  3. Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)

    文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...

  4. R语言names函数获取或者设置数据对象名称实战

    R语言names函数获取或者设置数据对象名称实战 目录 R语言names函数获取或者设置数据对象名称实战 #基本语法

  5. Objective-C学习笔记(十九)——对象方法和类方法的相互调用

    事实上在OC的对象方法(减号方法)和类方法(加号方法)并非相互独立的,它们也能够发生千丝万缕的关系,今天我们来研究下它们两者相互调用的问题.该样例还是以People类为基础. (一)对象方法调用类方法 ...

  6. sql server无效的对象名称 - 但表列在SSMS表列表中

    本文翻译自:sql server invalid object name - but tables are listed in SSMS tables list I am attempting to ...

  7. 【Groovy】Groovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 创建 GroovyShell 对象并执行 Groovy 脚本 | 完整代码示例 )

    文章目录 一.Groovy 类中调用 Groovy 脚本 1.创建 GroovyShell 对象并执行 Groovy 脚本 2.代码示例 二.完整代码示例 1.调用者 Groovy 脚本的类 2.被调 ...

  8. 【Groovy】Groovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 参考 Script#evaluate 方法 | 创建 Binding 对象并设置 args 参数 )

    文章目录 一.Groovy 类中调用 Groovy 脚本 1.参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2.创建 Binding 对象并设置 args ...

  9. 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )

    文章目录 前言 一.静态代理的弊端 二.动态代理的优势 三.动态代理使用流程 1.目标对象接口 2.被代理对象 3.调用处理程序 4.客户端 四.动态生成 代理对象 类 的 字节码 文件数据 前言 代 ...

  10. 类和对象—对象特性—函数的分类和调用

    构造函数的分类及调用 两种分类方式: 按参数分类分为:有参构造和无参构造 按类型分类分为:普通构造和拷贝构造 三种调用方式 括号法 显示法 隐式转换法 匿名对象 特点:当前行执行结束后,系统会立即回收 ...

最新文章

  1. 【只需4步】windows server系统下快速安装绿色版apache-tomcat-8.0.35(免安装版)
  2. 2020 年,人工智能和深度学习未来的五大趋势
  3. 「AI初识境」近20年深度学习在图像领域的重要进展节点
  4. 硬盘FAT32转NTFN格式的命令
  5. 多协程实例分析(一)
  6. 获取excel名称java_使用Apache POI获取大型Excel文件的Excel工作表名称
  7. Android 中文API (68) —— BluetoothClass.Service
  8. 开源游戏《一小时人生》GitHub仓库被删,CEO亲自道歉
  9. OSError: Initializing from file failed
  10. java文件处理:文件流、上传、下载
  11. 今天第72个儿童节,程序猿“童”样精彩~
  12. 如何写期刊论文的文献综述
  13. IP编址与子网掩码与划分
  14. 新版本Google在安装外部扩展插件的时候会提示“程序包”无效的解决方法
  15. html转成高清pdf,Javascript实现html转pdf高清版(提高分辨率)
  16. verdi 文件格式转换及差异
  17. python自动战斗文字小游戏
  18. 手册上的GeoIP扩展详解,按手册整理了一遍
  19. java 判断一个数字是否是素数。 素数,质数, 只能被1和自身整除的数。
  20. Origin2017绘图给部分点添加标签

热门文章

  1. centos7恢复mysql数据库_MySQL数据库升级迁移填坑记
  2. vs写c语言能用scanf,【PAT编写代码时遇到的问题】vs中使用scanf(%c,x);
  3. vs使用未初始化的内存怎么解决_遇到C语言内存错误怎么办?一定要找准这六个原因...
  4. java怎么表示正无穷大_java中怎样表示一个无穷大? 无穷小?
  5. android ios av tv,iOS使用AVPlayer制作战旗TvDEMO OC版
  6. ionic保存到mysql_ionic sqlite 存取数据封装(兼容真机与webkit浏览器)
  7. mysql百万数据根据索引查询_mysql创建多列索引查询百万表数据的性能优化经验分享...
  8. @value 默认值为null_JAVA8之妙用Optional解决判断Null为空的问题
  9. 超过响应缓冲区限制_Nginx如何限制并发连接数和连接请求数?
  10. linux产生随机数方法