lambda表达式的捕获跟参数差不多,可以是值或者引用。

1.值捕获

与传值参数类似,采用值捕获的前期是变量可以拷贝;与参数不通透的是:被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝。

void func(){
int v1 = ;
auto f = [v1] { return v1;};
v1 = ;
auto j = f(); //j为1;f保存了我们创建它时v1的拷贝
}

2.引用捕获

在使用引用捕获的时候,由于lambda保存的是引用,因此值会随着引用变化而变化。

void func(){
int v1 = ;
auto f = [&v1] { return v1;};
v1 = ;
auto j = f(); //j为0;f保存的是v1的引用,而非拷贝
}

在以上两种捕获的方式中,都有着相同的问题和限制:lambda捕获的是局部变量,如果lambda在函数结束后执行,那么这些局部变量就都消失了。

除了上面两种捕获之外,我们还可以采用隐式捕获。

3.隐式捕获

为了指示编译器推断捕获列表,我们可以在捕获列表中写一个&或=。&告诉编译器采用引用捕获,=则为值捕获方式。如:

auto f = [&] {return v1};
auto f = [=] {return v1};

除了&与=,还有以下的捕获列表

[]                             空捕获列表

[names]                    names是一个逗号分隔的名字列表,默认全部都被拷贝

[&]                           引用捕获

[=]                           值捕获

[&,identifier_list]        identifier_list为一个逗号分隔的列表,包含多个来自函数的变量,均采用值捕获方式,而任何隐式捕获的变量都采用引用捕获的方式

[=,identifier_list]        identifier_list为一个逗号分隔的列表,包含多个来自函数的变量,均采用引用捕获方式,而任何隐式捕获的变量都采用值捕获的方式

[012]泛型--lambda表达式捕获的更多相关文章

  1. Lambda表达式的参数捕获

    以常用的Action委托为例: 有如下3个无参数的方法: public void Function() { //Do something } public void Function2() { //D ...

  2. 第17课 lambda表达式

    一. lambda表达式 (一)语法定义:[capture](paramters) mutable ->returnType{statement} 1.[capture]:捕获列表 (1)lam ...

  3. 【C++】C++中的lambda表达式和函数对象

    目录结构: contents structure [-] lambda表达式 lambda c++14新特性 lambda捕捉表达式 泛型lambda表达式 函数对象 函数适配器 绑定器(binder ...

  4. (摘录)ISO C++ Lambda表达式

    ISO C++ 11 标准的一大亮点是引入Lambda表达式.基本语法如下: [捕获列表](形参列表) mutable ->返回值类型 复合语句 其中除了"[]"(其中捕获列 ...

  5. C++的匿名函数(lambda表达式)

    总述  C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). 它是定义和使用匿名函数对象的一种简便的方式.匿名函数是我们需要用到的一个函数,但是又不想去费力命名一个函数的 ...

  6. Spark中Lambda表达式的变量作用域

    通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...

  7. c++11 新特性之lambda表达式

    写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input paramete ...

  8. 委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

    本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function&l ...

  9. 在Lambda表达式中使用循环变量

    在C#5.0之前,如果在foreach循环中的lambda表达式里使用循环变量,那么你会发现一些意想不到的现象,例子如下: , , , }; var actions = new List<Act ...

随机推荐

  1. 【转】 COCOS2D-X之使用CURL下载图片的一个简单Demo

    #include"curl/curl.h" #pragma  comment(lib,"libcurl_imp.lib") bool HelloWorld::i ...

  2. 【转】COCOS2D-X之不断变化的数字效果Demo

    我们在玩"天天爱消除"或"天天连萌"的时候,每玩一盘后会有一个游戏结果界面,上面有一个显示所得分数的效果.今天我们这个Demo就是要实现与之相近的效果. 一.我 ...

  3. Js计算-当月每周有多少天

    查看Demo: 源代码如下: <script> //计算当月总天数 function getCountDays() { var curDate = new Date(); /* 获取当前月 ...

  4. 单实例运行tz

    (引用了 Microsoft.VisualBasic.ApplicationServices)SingleInstanceApplicationWrapper.cs    using System.W ...

  5. 【Jenkins】linux下Jenkins集成ant进行编译并发送结果

    三个文章吧: 1 如何使用ant编译执行jmeter测试用例,并生成html报告 2 如何在Linux下搭建jenkins环境. 3 如何在Linux下搭建的jenkins中执行ant构建运行,并发送 ...

  6. [Tommas] 测试用例覆盖率(二)

    二.详细用例的设计 划分好了测试项,接着就是针对各个测试项,考虑具体的测试用例了.根据测试项的特点,测试用例的设计角度也有所不同.下面我们就来看看通常的功能点测试用例,该从哪些角度出发来进行设计: 1 ...

  7. java基础之数据类型转换

    在写java程序时,经常会遇到需要数据类型转换,下面我们来介绍一些一些基本数据类型之间的转换. 1.int,folat,double,boolean,long 转换成字符串,其实很简单只需使用一个函数 ...

  8. mysql远程连接出现 ERROR 2003 (HY000): Can't connect to MySQL server on IP

    修改了如下两个位置,解决了这个问题: 修改/etc/mysql/my.cof配置文件:因为mysql默认只允许本机连接 修改远程连接用户权限:远程连接的用户被设置为不允许远程连接 首先修改/etc/m ...

  9. 《Oracle Database 12c DBA指南》第二章 - 安装Oracle和创建数据库(2.1 安装Oracle数据库软件和创建数据库概览)

    当前关于12c的中文资料比较少,本人将关于DBA的一部分官方文档翻译为中文,很多地方为了帮助中国网友看懂文章,没有按照原文句式翻译,翻译不足之处难免,望多多指正. 2.1 安装Oracle数据库软件和 ...

  10. MapReduce自定义二次排序流程

    每一条记录开始是进入到map函数进行处理,处理完了之后立马就入自定义分区函数中对其进行分区,当所有输入数据经过map函数和分区函数处理完之后,就调用自定义二次排序函数对其进行排序. MapReduce ...