c++11标准:匿名函数(匿名表达式)lambda

lambda:

  C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下:

    匿名函数定义/匿名表达式声明:[capture](parameters)->return-type{body}

    函数调用:function a = [capture](parameters)->return-type{body};

         a(parameters);

 

  parameters:形参

    和函数一样

    如果没有参数,空的圆括号()可以省略.

    返回值也可以省略,如果函数体只由一条return语句组成或返回类型为void的话.形如:

       [capture](parameters){body}

      返回值类型可以通过以下算法推演出来

      •   如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。
      •   如果没有 return 语句,则类似 void f(...) 函数。

    例如:

[](int x, int y) { return x + y; } // 隐式返回类型
[](int& x) { ++x; }   // 没有return语句 -> lambda 函数的返回类型是'void'
[]() { ++global_x; }  // 没有参数,仅访问某个全局变量
[]{ ++global_x; }     // 与上一个相同,省略了()

  []:外部闭包

    Lambda函数可以引用在它之外声明的变量. 这些变量的集合叫做一个闭包.  闭包被定义在Lambda表达式声明中的方括号[]内.

    闭包可以按值、引用捕获:

    例如:  

[]        //未定义变量.试图在Lambda内使用任何外部变量都是错误的.
[x, &y]   //x 按值捕获, y 按引用捕获.
[&]       //用到的任何外部变量都隐式按引用捕获
[=]       //用到的任何外部变量都隐式按值捕获
[&, x]    //x显式地按值捕获. 其它变量按引用捕获
[=, &z]   //z按引用捕获. 其它变量按值捕获

    对this的捕获:只可以是值捕获,

      在类成员中的lamda函数:

      对protect和priviate成员来说, 这个lambda函数与创建它的成员函数有相同的访问控制.

      访问this的成员不必使用this->语法,可以直接访问.

    注意:如果一个闭包含有局部变量(类和局部)的引用,在超出创建它的作用域之外的地方被调用的话,这种行为是未定义的!

 

 

lambda函数是一个依赖于实现的函数对象类型,这个类型的名字只有编译器知道.

如果用户想把lambda函数做为一个参数来传递, 那么形参的类型必须是模板类型或者必须能创建一个std::function类似的对象去捕获lambda函数.

使用 auto关键字可以帮助存储lambda函数,  

 

转载于:https://www.cnblogs.com/yiii/p/5139130.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web框架——Flask系列之Flask中的特殊变量和方法(十九)

在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。 一、config对象 config 对象就是Flask的config对象,也就是 app.config 对象。 {{ config.SQLALCHEMY_DATABASE_URI }}二、request 对象 就是 Flask 中表示当前请求的 request 对象&am…

数据库和ORMS:使用SQLAlchemy与数据库通信

文章目录1. 环境安装2. 使用SQLAlchemy与SQL数据库通信2.1 创建表2.2 连接数据库2.3 insert、select2.4 update、delete2.5 relationships2.6 用Alembic进行数据库迁移learn from 《Building Data Science Applications with FastAPI》1. 环境安装 docker 安装 MongoDB 服务 d…

PyCharm 5 破解注册方法

方法: 调整时间到2038年。 申请30天试用 退出pycharm 时间调整回来即可。 或者: 注册时选择 License server ,填 http://idea.lanyus.com ,然后点击 OK 开始学习python,加油!转载于:https://www.cnblogs.com/dzzy/p/51…

Web框架——Flask系列之数据库迁移(二十)

一、Flask-Migrate扩展 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动…

LeetCode 2206. 将数组划分成相等数对

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums ,它包含 2 * n 个整数。 你需要将 nums 划分成 n 个数对,满足: 每个元素 只属于一个 数对。同一数对中的元素 相等 。 如果可以将 nums 划分成 n 个数对,请你返回 true …

【iCore3 双核心板】例程三十五:HTTP_IAP_ARM实验——更新升级STM32

实验指导书及代码包下载: http://pan.baidu.com/s/1eRgzSPW iCore3 购买链接: https://item.taobao.com/item.htm?id524229438677 转载于:https://www.cnblogs.com/xiaomagee/p/5143326.html

Web框架——Flask系列之蓝图Blueprint(二十一)

一、为什么学习蓝图? 我们学习Flask框架,是从写单个文件,执行hello world开始的。我们在这单个文件中可以定义路由、视图函数、定义模型等等。但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程序文件…

map小练

1 //2 //map是一个标准的关联式容器,一个map是一个键值对序列,即(key,value)对。3 //它提供基与key 的快速检索能力。map中key值是唯一的。4 //集合中的元素按一定的顺序排列。元素插入过程是按排列规则插入,所以不能指…

LeetCode 2207. 字符串中最多数目的子字符串(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern ,两者都只包含小写英文字母。 你可以在 text 中任意位置插入 一个 字符,这个插入的字符必须是 pattern[0] 或者 pattern[1] 。注…

指令系统——指令格式(详解)

一、总览 二、指令的定义 指令(又称机器指令): 是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。 一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。 注:一台计算机只能执行自己…

MySQL中Index Condition Pushdown(ICP)优化

在MySQL 5.6开始支持的一种根据索引进行查询的优化方式。之前的MySQL数据库版本不支持ICP,当进行索引查询是,首先根据索引来查找记录,然后在根据WHERE条件来过滤记录。在支持ICP后,MySQL数据库会在取出索引的同时,判断…

LeetCode 2208. 将数组和减半的最少操作次数(优先队列)

文章目录1. 题目2. 解题1. 题目 给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作) 请你返回将 nums 数组和 至少 减少一半…

指令系统——数据存放、指令寻址(详解)

一、总览 二、数据存放 三、指令寻址 四、小结:

kafka初探

1,启动kafka自带的zookeeper ./zookeeper-server-start.sh ../config/zookeeper.properties 1>/dev/null 2>&1 & 1>/dev/null 将输出定位到一个空的位置 2>&1 错误输出同 1一样定位到空位置 &:最后这个&符号指在后台输出…

数据库和ORMS:使用Tortoise ORM与数据库通信

文章目录1. 安装环境2. 创建数据库模型3. 设置 Tortoise 引擎4. create5. 查询6. 修改、删除7. 添加关联8. 用Aerich建立数据库迁移系统learn from 《Building Data Science Applications with FastAPI》Tortoise ORM 是一种现代异步 ORM,非常适合 FastAPI项目 1. …

指令系统——数据寻址(1)(详解)

一、总览 二、操作数类型与寻址方式 三、数据寻址 四、立即寻址 立即寻址:形式地址A就是操作数本身,又称为立即数,一般采用补码形式。#表示立即寻址特征。 一条指令的执行:取指令访存1次,执行指令访存0次,暂…

使用 docker 搭建开发环境

作为一个 freelancer,经常能够接到很多的开发工作,这些金主,有喜欢 PHP 的,有习惯撒手不管的;有偏好 sqlite 的,也有喜欢 PG 的,我甚至见过 mysql、PG 一起使用的项目;同一门语言下&…

数据库和ORMS:使用 Motor 跟 MongoDB 通信

文章目录1. 安装2. 创建models3. 连接数据库4. 插入文档5. 查询6. 更新、删除7. 嵌套文档learn from 《Building Data Science Applications with FastAPI》面向文档的数据库(如MongoDB)不需要预先配置模式 Motor,这是一个用于与 MongoDB 异…

指令系统——数据寻址(2)(详解)

一、总览 二、偏移寻址 基址寻址:将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA(BR)A。 注:基址寄存器是面向操作系统的,其内容由…

sed tr 去除PATH中的重复项

最近发现由于自己不良的安装软件的习惯,shell的PATH路径包含了很多冗余的项。这里使用shell命令去除PATH的冗余项。 export PATH$(echo $PATH | sed s/:/\n/g | sort | uniq | tr -s \n : | sed s/:$//g)上面的代码可以去除linux环境变量中的重复项。 最近查看环境…