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. HDU 1503 Advanced Fruits (LCS,变形)

    题意: 给两个水果名,要求他们的LCS部分只输出1次,其他照常输出,但是必须保持原来的顺序! 思路: 求LCS是常规的,但是输出麻烦了,要先求LCS,再标记两串中的所有LCS字符,在遇到LCS字符时, ...

  2. apache开源项目--Mahout

    Apache Mahout 是 Apache Software Foundation (ASF) 开发的一个全新的开源项目,其主要目标是创建一些可伸缩的机器学习算法,供开发人员在 Apache 在许可 ...

  3. Velocity是如何工作的

    当在一个应用程序或者servlet中使用Velocity的时候,你要做如下几个工作: 初始化Velocity.Velocity提供2种使用形式,不管是单一实例模式还是单独运行实例模式,初始化过程都只做 ...

  4. GIS中相交的定义(OGC相交的定义)

    我们常用GIS中的相交,比如在地图漫游的时候,屏幕显示的图形和屏幕这个包络线就是相交的关系.我们常用的GIS工具,拉框查询,这个用到的也是相交. 首先题目开起来很简单(开始的时候我是这样想的),但是做 ...

  5. 初识Ajax---简单的Ajax应用实例

    原文: http://www.ido321.com/347.html 从网页前端输入提示范围内的字符,然后显示从后台返回的结果 1: <html> 2: <head> 3: & ...

  6. NOIP2005 过河

    过河 (river.pas/c/cpp) [问题描述] 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正 ...

  7. 山东省2016acm省赛

    A 水 #include <iostream> #include <cstdio> #include <algorithm> #include <list&g ...

  8. 50道经典的JAVA编程题 (1-5)

    后天java考试,现在闲着也是闲着,来做做java题吧. 前不久在网上看见了50道java算法编程题,感觉还不错,记得大一学C语言的时候做过一些,现在用java来回顾下吧,也算应付考试吧. 代码要是有 ...

  9. sublime Text2.0.2注册码

    ----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC ...

  10. 搭建Discuz! (mysql+apache+Discuz! )

    0. 配置环境 0.0 安装apache 0.1 安装php 1.数据库准备 1.1 创建数据库用户 1.2 创建discuz使用的数据库(编码:utf8-general-ci) 1.3 把1.2创建 ...