C++11加入了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解.

lambda表达式包括下面部分.

[capture_block](parameters) mutable exception_specification->return_type {body}

如今分析各个部分的内容:

(capture_block)捕捉块:指定怎样捕捉所在作用域的变量,并供给lambda主体部分使用.

(parameter)參数(可选):lambda表达式使用的參数列表.仅仅有在不须要不论什么參数而且没有指定mutable,一个exception_specification和一个return_type的情况下能够忽略该列表.不论什么类型在某些情形下也是能够忽略的.比如:[]{return 10;};

mutable:(可选):假设所在作用域的变量是通过值捕捉的,那么lambda表达式的主体中就不能改动这些副本的值.这些副本默认标记为const,因此lambda表达式主体不能改动这些副本的值.假设lambda表达式标记为mutable,那么这些副本则不是const,因此主体能够改动这些本地副本.(类似于參数传递中的值传递以及引用传递改动源值)

exception_specification:(可选)用于指定lambda表达式能够抛出的异常.

Return_type(可选)返回值的类型:假设忽略了return_type,那么编译器会依据下面原则推断返回类型:

1)假设lambda表达式主体的形式为{return exception;},那么lambda表达式的return_type为exception的类型;

2)其它情况下的return_type为void.



以下看一些样例:

//test2.cpp

#include <iostream> 

using namespace std; 

int main(){ 





[]{cout<<"hello lambda!"<<endl;}(); 





}

看编译以及执行的结果





来剖析一下这个lambda表达式的各部分

[]{cout<<"hello lambda!"<<endl;}(); 





[]:这是捕捉块,參数为空;

{cout<<"hello lambda!"<<endl;}:这是body

():这是为了让该lambda表达式马上运行.

由于实际上[]{cout<<"hello lambda!"<<endl;}就是lambda表达式的全部组成部分,其功能类似于一个匿名的函数,要让其马上运行,必须调用该函数,而该函数是匿名的,该怎样调用呢?

事实上[]{cout<<"hello lambda!"<<endl;}就相当于函数的名称了,由于其參数为空,因此仅仅须要传递一个空參就可以调用,要验证也是非常easy的,比如

#include <iostream> 

using namespace std; 

int main(){ 





[](int n){cout<<"hello lambda!+"<<n<<endl;}(10086); 





}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">



能够非常easy看出当中的规律!

再看一个复杂一点的拥有返回值的lambda表达式.

#include <iostream> 

#include <string> 

using namespace std; 

int main() 

{ 

string result=[](const string &str)->string{return "this is "+str;}("lambda!"); 

cout<<result<<endl; 

}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">



string result=[](const string &str)->string{return "this is "+str;}("lambda!"); 

这个样例里面指明了这个lambda返回值为string!

当然,这个返回值也是能够忽略的,返回值就是"this is "+str的类型,非常明显,这是一个string类型.





还能够保存指向lambda表达式的指针,这样就能够非常方便的调用该lambda表达式,使用C++11中的autokeyword进行声明.比如:

#include <iostream> 

#include <string> 

using namespace std; 

int main() 

{ 

auto func=[](const string &str){return "this is "+str;}; 

cout<<func(" one!")<<endl; 

cout<<func(" two!")<<endl;

}

这样,就能够对lambda表达式进行代码重用了!

对lambda的基本介绍就到这里了,更深入的内容请看下一章.

C++11新特性(3) lambda表达式(1)的更多相关文章

  1. C++11新特性之一——Lambda表达式

    C++11新特性总结可以参考:http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html#section_6.8 C++ ...

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

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

  3. C++11 新特性:Lambda 表达式

    参考文章:https://blogs.oracle.com/pcarlini/entry/c_1x_tidbits_lambda_expressions 或许,Lambda 表达式算得上是 C++ 1 ...

  4. C++11 新特性之 Lambda表达式

    lambda表达式能够用于创建并定义匿名的函数对象,以简化编程工作 Lambda的语法例如以下: [函数对象參数](操作符重载函数參数)->返回值类型{函数体} []内的參数指的是Lambda表 ...

  5. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  6. Java8 新特性学习 Lambda表达式 和 Stream 用法案例

    Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...

  7. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  8. Java8新特性之Lambda表达式

    lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让我们的java程序设计更加简洁.最近新的项目摒弃了1.6的版本,全面基于java8进行开发,本文是java ...

  9. 夯实Java基础(二十二)——Java8新特性之Lambda表达式

    1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...

随机推荐

  1. Java Socket(3): NIO

    NIO采取通道(Channel)和缓冲区(Buffer)来传输和保存数据,它是非阻塞式的I/O,即在等待连接.读写数据(这些都是在一线程以客户端的程序中会阻塞线程的操作)的时候,程序也可以做其他事情, ...

  2. 【转】visual studio 2012进行C语言开发[图文]

    原文网址:http://blog.csdn.net/chengyafei0104/article/details/9826025 现在大家计算机大概都脱离XP了,so,之前蛮多可以用的编译器,可能放在 ...

  3. 在Android应用中使用Clean架构

    自从开始开发安卓应用,我一直感觉我可以做得更好.我看过不少烂代码,其中当然有我写的.安卓系统的复杂性加上烂代码势必酿成灾祸,所以从错误中成长就很重要.我Google了如何更好地开发应用,发现了这个叫做 ...

  4. 【c++内存分布系列】虚基类表

    虚基类表相对于虚函数表要稍微难理解些,故单独提出来. 虚函数表是在对象生成时插入一个虚函数指针,指向虚函数表,这个表中所列就是虚函数. 虚基类表原理与虚函数表类似,不过虚基类表的内容有所不同.表的第一 ...

  5. [转] TreeList 当前节点图标和背景色设置

    高原之上原文TreeList 选中节点时图标状态和背景色 // 给TreeList加SelectImage this.treelArea.SelectImageList = imglCustom; / ...

  6. hadoop2.0中无法启动datanode的问题

    问题描述:在启动datanode进程时,能成功的启动:但用jps查看进程时,发现进程不存在,下面是在datanode日记文件的错误信息 如下图的截屏所示: 主要原因:发生错误的原因:由于把data放在 ...

  7. codeforces 678D Iterated Linear Function 矩阵快速幂

    矩阵快速幂的题要多做 由题可得 g[n]=A*g[n-1]+B 所以构造矩阵  { g[n] }    =  {A   B}  * { g[n-1]} {   1   }         {0   1 ...

  8. Linux学习笔记:CentOS安装MySQL

    [1]安装版本: 1.1 CentOS-7-x86_64-Everything-1503-01    1.2 MySQL-5.6.27-1.linux_glibc2.5.x86_64.rpm-bund ...

  9. 连分数(分数类模板) uva6875

    //连分数(分数类模板) uva6875 // 题意:告诉你连分数的定义.求连分数,并逆向表示出来 // 思路:直接上分数类模板.要注意ai可以小于0 #include <iostream> ...

  10. mybatis系列-05-SqlMapConfig.xml详解

    mybatis的全局配置文件SqlMapConfig.xml,配置内容如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandler ...