i.e.
int x = 10;
int y = 20;
int z = [&]{
x = x * x;
y = y * y;

return x + y;
}();

上面z后面以[]开头的为一个lambda表达式,
中括号里可以有用来表示捕捉符号,等号"="表示以值传递的方式使用lambda外部变量, 与号"&"表示引用方式使用;
mutable表示在lambda表达式中可以对变量进行修改lambda外部的变量的值。

如下:
auto add = [=](int param1, int param2) {
param1 += 100; //error, 不让修改lambda外部的变量x
param2 += 200 ; //error, 不让修改lambda外部的变量y
return x + y;
};

修改方法如下:
int x = 10;
int y = 20;

auto add = [=](int param1, int param2) mutable {
x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
return x + y;
};

int sum = add(100, 200);
执行完后: x == 10, y == 20,这是因为中括号"[]"里是等号"=", 表示值传递方式使用lambda外部变量,不会修改原来的值, 执行完后sum == 330,

上面是以值传递的方式使用lambda外部变量的值, 而且没有写明lambda表达式返回类型, 因为lambda表达式里有return语句,因此lambda表达式的返回值为return返回的值类型,如果接收方和return返回类型不匹配则可以自动隐式转换,如果不能转换则报错。

如果写明返回类型则如下:
auto add = [=](int param1, int param2) mutable ->int {
x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
return x + y;
};

如果是引用传递则如下:
auto add = [&](int param1, int param2) mutable     ->int {
x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
return x + y;
};
以应用方式使用lambda外部变量,
int result = add(100, 200);
执行完后result == 330, x == 110, y == 220。

------------------------------------------------------------------------------------
auto add = [&](int param1, int param2) mutable   ->float {
x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
return x + y;
};

int result = add(10, 20); //隐式转换
执行完后result == 330(330.0F转换而来), x == 110, y ==220 。

-------------------------------------------------------------------------
lambda表达式还可以作为函数实参,如下:
#include <vector>
#include <algroithm>
using namespace std;

vector<int> iVec(10); //10个元素的vector
for(auto iter = iVec.begin(); iter != iVec.end(); ++ iter)
{
*iter = 2; //每个元素都为2;
}
for(auto& i : iVec) //引用方式
{
i = i * 2; //每个元素都乘以2;
}

int sum = 0;

//每个元素的值累加;
for_each(iVec.begin(), iVec.end(),
[&](int n) { int m = n; sum += m }
);

执行完后 sum == 40.

参考资料:http://www.cnblogs.com/L-hq815/archive/2012/08/23/2653002.html
http://blog.jobbole.com/44015/#jtss-tqq

【C++11】 lambda表达式的更多相关文章

  1. C++11 lambda 表达式

    C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lamb ...

  2. C++11 lambda 表达式解析

    C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lamb ...

  3. 详解 C++11 lambda表达式

    详解 C++11 lambda表达式   lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的la ...

  4. C++11 lambda表达式学习

    lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的lambda表达式自己的认识.这里有参考文档h ...

  5. C++ 11 Lambda表达式

    C++11的一大亮点就是引入了Lambda表达式.利用Lambda表达式,可以方便的定义和创建匿名函数.对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多 ...

  6. C++11 lambda表达式是如何实现的?

    lambda表达式是如何实现的呢? 其实是编译器为我们了创建了一个类,这个类重载了(),让我们可以像调用函数一样使用.所以,你写的lambda表达式和真正的实现,是这个样子的: 而对于捕获变量的lam ...

  7. C++ 11 Lambda表达式、auto、function、bind、final、override

    接触了cocos2dx 3.0,就必须得看C++ 11了.有分享过帖子:[转帖]漫话C++0x(四) —- function, bind和lambda.其实最后的Lambda没太怎么看懂. 看不懂没关 ...

  8. c++11——lambda表达式

    lambda表达式 函数式编程的一个语法,有如下优点: (1)声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象.以更直接的方式写程序,好的可读性和可维护性. (2) ...

  9. C++11 Lambda表达式简单解析

    C++11 新增了非常多特性,lambda 表达式是当中之中的一个.假设你想了解的 C++11 完整特性, 建议去http://www.open-std.org/看看新标准! 非常多语言都提供了 la ...

  10. C++11 lambda表达式(19篇C++11文章)

    C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问. Lambda表达式的语法通过下图来介绍: 这里假设我们定义了一个如上图的lam ...

随机推荐

  1. 目标检测的图像特征提取之(二)LBP特征

    LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像年提出,用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征: 1.LBP特征的描述 原始的LBP算子定义为在3* ...

  2. CentOS7安装Hadoop2.7完整流程

    总体思路,准备主从服务器,配置主服务器可以无密码SSH登录从服务器,解压安装JDK,解压安装Hadoop,配置hdfs.mapreduce等主从关系. 1.环境,3台CentOS7,64位,Hadoo ...

  3. Rebound-Android的弹簧动画库

    Rebound是facebook出品的一个弹簧动画库,与之对应的IOS版本有一个pop动画库,也是非常的强大给力.Facebook真是互联网企业中的楷模,开源了很多的实用开源库,大赞一个!!! 讲解R ...

  4. Android:文件夹显示红色叹号

    有感叹号,说明有的文件损坏或丢失了 解决方法: 右击工程,Build Path..->Configure Build Path...->Java Build Path 可以看到引用的jar ...

  5. Android The content of the adapter has changed but ListView did not receive a notification终极解决方法

    这几天做一个自动扫描SD卡上所有APK文件的小工具,扫描过程中会把APK添加到LISTVIEW中显示,结果出现以下错误:(有时候触摸更新数据时候,触摸listview也会报错) E/AndroidRu ...

  6. 写给系统管理员的25个PHP安全实践

    PHP是广泛使用的开源服务端脚本语言.通过HTTP或HTTPS协议,Apache Web服务允许用户访问文件或内容.服务端脚本语言的错误配置会导致各种问题.因此,PHP应该小心使用.以下是为系统管理员 ...

  7. Linux进程调度和切换过程分析

    内容: (1):从schedule()开始,几种不同类型的进程之间的调度选择;在相同类型的进程之间的调度选择算法 (2):从CPU的IP值的变化上,说明在switch_to宏执行后,执行分析 (3): ...

  8. HDFS小文件处理——Mapper处理

    处理小文件的时候,可以通过org.apache.hadoop.io.SequenceFile.Writer类将所有文件写出到一个seq文件中. 大致流程如下: 实现代码: package study. ...

  9. CRC校验码

    循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码.对于一个给定的(N,K)码,可以证明存在一个最高次幂为R的多项式G(x)(R ...

  10. POJ 1681 Painter's Problem (高斯消元 枚举自由变元求最小的步数)

    题目链接 题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要 ...