C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda的语法形式如下:
              [函数对象参数] (操作符重载函数参数) mutable或exception声明 ->返回值类型 {函数体}
      可以看到,Lambda主要分为五个部分:[函数对象参数]、(操作符重载函数参数)、mutable或exception声明、->返回值类型、{函数体}。下面分别进行介绍。
      一、[函数对象参数],标识一个Lambda的开始,这部分必须存在,不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式:
           1、空。没有使用任何函数对象参数。
           2、=。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。
           3、&。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。
           4、this。函数体内可以使用Lambda所在类中的成员变量。
           5、a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
           6、&a。将a按引用进行传递。
           7、a, &b。将a按值进行传递,b按引用进行传递。
           8、=,&a, &b。除a和b按引用进行传递外,其他参数都按值进行传递。
           9、&, a, b。除a和b按值进行传递外,其他参数都按引用进行传递。
      二、(操作符重载函数参数),标识重载的()操作符的参数,没有参数时,这部分可以省略。参数可以通过按值(如:(a,b))和按引用(如:(&a,&b))两种方式进行传递。
      三、mutable或exception声明,这部分可以省略。按值传递函数对象参数时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。exception声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用throw(int)。
      四、->返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。
      五、{函数体},标识函数的实现,这部分不能省略,但函数体可以为空。
      下面给出了一段示例代码,用于演示上述提到的各种情况,代码中有简单的注释可作为参考。

<span xmlns="http://www.w3.org/1999/xhtml" style="">class CTest
{
public:CTest() : m_nData(20) { NULL; }void TestLambda(){vector<int> vctTemp;vctTemp.push_back(1);vctTemp.push_back(2);// 无函数对象参数,输出:1 2{for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });}// 以值方式传递作用域内所有可见的局部变量(包括this),输出:11 12{int a = 10;for_each(vctTemp.begin(), vctTemp.end(), [=](int v){ cout << v+a << endl; });}// 以引用方式传递作用域内所有可见的局部变量(包括this),输出:11 13 12{int a = 10;for_each(vctTemp.begin(), vctTemp.end(), [&](int v)mutable{ cout << v+a << endl; a++; });cout << a << endl;}// 以值方式传递局部变量a,输出:11 13 10{int a = 10;for_each(vctTemp.begin(), vctTemp.end(), [a](int v)mutable{ cout << v+a << endl; a++; });cout << a << endl;}// 以引用方式传递局部变量a,输出:11 13 12{int a = 10;for_each(vctTemp.begin(), vctTemp.end(), [&a](int v){ cout << v+a << endl; a++; });cout << a << endl;}// 传递this,输出:21 22{for_each(vctTemp.begin(), vctTemp.end(), [this](int v){ cout << v+m_nData << endl; });}// 除b按引用传递外,其他均按值传递,输出:11 12 17{int a = 10;int b = 15;for_each(vctTemp.begin(), vctTemp.end(), [=, &b](int v){ cout << v+a << endl; b++; });cout << b << endl;}// 操作符重载函数参数按引用传递,输出:2 3{for_each(vctTemp.begin(), vctTemp.end(), [](int &v){ v++; });for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });}// 空的Lambda表达式{[](){}();[]{}();}}private:int m_nData;
};</span>

C++ 11 Lambda表达式相关推荐

  1. C++11:Lambda表达式(匿名函数)理解

    C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象.即你可以理解为(Lambda 表达式实际上是一个函数,只是它没 ...

  2. C++11 Lambda表达式(匿名函数)详解

    使用 STL 时,往往会大量用到函数对象,为此要编写很多函数对象类.有的函数对象类只用来定义了一个对象,而且这个对象也只使用了一次,编写这样的函数对象类就有点浪费. 而且,定义函数对象类的地方和使用函 ...

  3. C++11 lambda表达式、function类模板、bind函数适配器

    文章目录 lambda表达式 lambda表达式的语法 lambda表达式的原理 function模板 function与重载函数 bind函数适配器 lambda表达式 当我们在写代码的时候如果经常 ...

  4. [C++11]lambda表达式语法

    代码如下: #include <iostream> using namespace std;void func(int x, int y) {int a;int b;[=]() {int ...

  5. C++11 Lambda表达式

    1.简介 1.1定义 C++11新增了很多特性,Lambda表达式(Lambda expression)就是其中之一,很多语言都提供了 Lambda 表达式,如 Python,Java ,C#等.本质 ...

  6. C++11 lambda表达式与函数对象

    C++ lambda表达式与函数对象 lambda表达式是C++11中引入的一项新技术,利用lambda表达式可以编写内嵌的匿名函数,用以替换独立函数或者函数对象,并且使代码更可读.但是从本质上来讲, ...

  7. C++11——lambda表达式

    目录 前言 一.lambda表达式用法 二.lambda表达式语法 三.lambda表达式的原理 前言 在显示生活中,我们在用手机购物时.总是可以在页面上看到下面这样的选项. 我们知道底层这是通过排序 ...

  8. 1.11 Lambda表达式遍历Iterator迭代器

    Java使用Lambda表达式遍历Iterator迭代器 Java 8 为 Iterator 引入了一个 forEachRemaining(Consumer action) 默认方法,该方法所需的 C ...

  9. vector 使用 c++11 Lambda 表达式 排序

    struct SIndexDataNew {1 optional short shtMarket;2 optional string sCode;3 optional int iDate;4 opti ...

最新文章

  1. 关于Kanas.Net框架的一些背景
  2. 【杂谈】如何使用有三AI生态学习计算机视觉和自然语言处理等内容
  3. 自建SE16N功能,修改数据库表数据
  4. Java ThreadLocal 使用详解
  5. [CSS]BlendTrans滤镜
  6. 虚拟机安装Solaris10
  7. 在ABAP XSLT中调用ABAP类的方法
  8. 计算机语言学 自然语言处理程序,利用知网进行(计算机)自然语言处理
  9. python ftplib_python:使用ftplib编写FTP客户端
  10. android窗口动画体系,Android 7.1 GUI系统-窗口管理WMS-动画的执行(七)
  11. arp协议属于哪一层_TCP/IP协议栈-之-ARP协议分析
  12. Tomcat执行start文件后有乱码
  13. POJ 1469 COURSES 二分图最大匹配
  14. SQL PASS西雅图之行——University of Washington篇
  15. 啊哈C语言——让计算机多彩的开口说话
  16. 【OS】单道程序设计VS多道程序设计
  17. 数学建模优化模型简单例题_简单数学建模100例
  18. 人事管理系统实现(一)
  19. # Classification: Accuracy(准确率)
  20. solr的DIH操作同步mysql数据

热门文章

  1. 原始的Ajax请求方式 (XMLHttpRequest)
  2. struts的比较标签,在使用时,与测试时需要留心。
  3. 【Python-2.7】如何判断对象是否为可迭代?
  4. 【Python-3.3】字典中存储列表
  5. 【PL/SQL】异常处理
  6. 【Oracle】创建用户
  7. 网络管理与维护作业4
  8. C#对象赋值出现的诡异问题,或许你也遇到过,有待你的解决
  9. 拒绝:请求的对资源的访问被拒绝:泊坞窗
  10. 查找包含具有指定名称的列的所有表 - MS SQL Server