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的基本介绍就到这里了,更深入的内容请看下一章.

最新文章

  1. c# List 按类的指定字段排序
  2. G - YY&#39;s new problem(HUSH算法,目前还不懂什么是HUSH算法)
  3. EntityFramework中的线程安全,又是Dictionary
  4. 如何提高jQuery的性能
  5. operator模块
  6. 【转】js/jquery中刷新iframe方法(兼容主流)
  7. 十年磨一剑 Delphi重新崛起再写传奇
  8. Chapter 5 Blood Type——20
  9. symfony采坑
  10. codeforces 3b之贪心算法
  11. caffe-ssd的GPU安装时make test 报错:.build_release/test/test_all.testbin:
  12. 3.6 C++继承机制下的构造函数
  13. Kafka参数详解
  14. JavaScript中七种数据类型&#183;中&#183;一
  15. Android数据存储之SD卡
  16. 五、Delphi10.3通过REST单元使类和JSON数据互相转换
  17. struts的问题
  18. UITableView与UIScrollView的一些问题(持续更新)
  19. PO*创建标准采购订单
  20. 利用tca时间聚簇分析方法分析fmri数据

热门文章

  1. vi编辑器怎么设置tab缩进
  2. C#中可直接调用WIN32的API函数--USER32.DLL
  3. Zookeeper基本配置
  4. 使用supervisor监控进程
  5. C#进程操作
  6. Cell的一些坑: UITableViewCell宽度,在iphone5的时候是320,在iphone6的时候为啥也是320?
  7. java练习题:输出100以内与7有关的数、百马百担、打分(去掉最高、最低分)、二分法查找数据
  8. Java类的成员函数调用顺序
  9. [Java基础] SequenceInputStream输入合并流
  10. Codeforce727B --- Bill Total Value(字符串处理 正则表达式)
  11. 发几个速度快可以用的google IP,谷歌IP(转)
  12. MySQL Update 使用
  13. Date对象需要注意的点
  14. C#调用bat 不显示DOS窗口,禁止DOS窗口一闪而过
  15. vue 手机端开发 小商铺 添加购物车 以及结算 功能
  16. 搞懂MySQL分区
  17. CSS---内外边距
  18. java中字符串&quot;1999-10-01T00:00:00+08: 00&quot; 转化为Date格式
  19. JSTL的使用
  20. [leetcode268]Missing Number