C++11新特性(3) lambda表达式(1)

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); 


}


能够非常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; 
}


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



原文地址:https://www.cnblogs.com/mengfanrong/p/5338016.html