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. 套题T8&T9

    A - 8球胜负(eight) Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submi ...

  2. 第一个java程序(hdu 1001)

    //package yy;不能有 import java.util.*; public class Main {//必须为Main public static void main(String[] a ...

  3. spring @bean注解

    1.@bean注解用于注册一个bean到 到ioc容器中.类似于@component注解 2.@configure注解,相当于指明这个类是配置文件 3.@bean还可以指定initMethod,des ...

  4. Linux autoconf和automake使用

    作为Linux下的程序开发人员,一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Mak ...

  5. Java ssh 访问windows/Linux

     Java ssh 访问windows/Linux 工作中遇到的问题: Java code运行在一台机器上,需要远程到linux的机器同时执行多种命令.原来采用的方法是直接调用ssh命令或者调用pli ...

  6. Intellij IDEA 新建一个EJB工程(三)

    之前都是用IDEA启动JBoss服务器,并在启动的同时将EJB项目部署上去.在构建 artifacts 时遇到很多问题,明明是EJB项目却不能用EJB导出,真是奇怪~~ 后来用Web Applicat ...

  7. 【Spring】关于Boot应用中集成Spring Security你必须了解的那些事

    Spring Security Spring Security是Spring社区的一个顶级项目,也是Spring Boot官方推荐使用的Security框架.除了常规的Authentication和A ...

  8. 使用 powershell 的 grep 过滤文本

    使用 powershell 的 grep 过滤文本 有个log文件,大小在4M左右,要求找出里面耗时超过100s 的记录.首先想到了强大的 grep ,那么就搞起. 先在网上找一下资料,这篇文章,有几 ...

  9. Java实现-------网络蜘蛛

    闲来无事,学习了一下网络蜘蛛的简易原理.是最简单的一种,一般新手都可以看得懂哦~~读者可以将其进行扩展,可以实现用来抓取网页js或者css等等哦... package com.insist.entit ...

  10. toad for sqlserver5.7

    toad for sqlserver5.7 虽然SSMS很好很强大,不过有时候使用一些第三方工具可以使MSSQL DBA们更加的方便管理MSSQL toad for sqlserver5.7就是这样一 ...