概述C++11提供了对匿名函数的支持,称为Lambda函数(也称为Lambda表达式)。是一种方便的定义和使用匿名函数对象的方式。匿名函数是我们需要使用的函数,但是我们不想费心去命名函数。我们不必为每个值(或类型)编写单独的函数,更不用说将值存储在无聊的全局变量中了。使用lambda表达式编写内嵌的匿名函数来代替独立的函数或函数对象,使代码更具可读性。工作的时候,这个比较常用。匿名函数用于捕获函数内部变量,然后对变量进行操作。那么现在跟大家分享一下,我对Lambda表达式的理解只是一个基本的介绍。C++毕竟博大精深,还是需要深入研究一下。一、其结构一个lambda表达式一般有以下几个部分:1.一个可以为空的捕获列表,表示lambda表达式中可以使用定义环境中的哪些名称,这些名称的访问形式是copy或reference,捕获列表在[]内。2.一个可选参数列表,表示lambda表达式需要的参数,参数列表位于()中。3.一个可选的可变修饰符,表示lambda表达式可以修改自己的状态(即改变值捕获的变量的副本)4.一个可选的返回类型声明形式->5.A表达式的主体表示要执行的代码,表达式位于{}内。[capturelist](parameterlist)mutable(optional)exceptionattribute->returntype{//functionbody}上面的语法规则很容易理解,除了[capturelist]里面的东西,只是一般的函数函数名被省略,返回值使用->形式。所谓捕获列表,其实可以理解为一种参数类型。默认情况下,lambda表达式的内部函数体不能使用函数体外部的变量。这时候捕获列表就可以起到传递外部数据的作用。在lambda中,传递参数、返回结果、定义表达式体与普通函数一致。不同的是,普通函数不提供“捕获”局部变量的功能,而局部捕获的功能意味着lambda可以作为局部变量使用。功能使用,而普通功能不能。举个小例子来证明lambda表达式的简单性:Greaterthan是一个保存要比较的值的函数对象:structGreater_than(intval;Greater_than(lntv):val{v}{}booloperatorO(constpair&r){returnr.second>val;};我们也可以使用lambda表达式:autop=find_if(m.beginO,m.endO,[](constpair&r){returnr.second>42;});每当你定义一个lambda表达式时,编译器会自动生成一个匿名类(这个类当然重载了()运算符),我们称之为闭包类型(closuretype)。2.基本参数分析C++11中的Lambda表达式捕获外部变量主要有以下几种形式:[]:默认不捕获任何变量;[=]:默认所有变量都按值捕获;[&]:默认所有变量按引用捕获;[x]:只按值捕获x,不捕获其他变量;[&x]:只按引用捕获x,不捕获其他变量;[=,&x]:捕获所有variables默认按值,但x是一个异常,通过引用捕获;[&,x]:默认情况下,所有变量都是通过引用来捕获的,但是x是一个例外,它是通过值来捕获的;[this]:通过引用捕获当前对象(实际上是一个拷贝指针);[*this]:按值捕获当前对象;在上面的捕获方法中,注意不要使用[=]和[&]默认捕获所有变量。首先,默认的引用捕获了所有的变量,你很可能会有悬空引用(Danglingreferences),因为引用捕获不会延长被引用变量的声明周期。比如传入一个形参,我们就捕获它,作为返回值执行。因为函数传入后,这个函数不会保存变量,函数执行完会自动释放。那么这个返回值的时候可能会产生一个无意义的结果。autoevt_set_status_x=[&](EventTypex){status[x]=true;/*我们可以通过引用捕获的变量来修改变量的数据*/};[&]是一个捕获列表(capturelist),它指定将通过引用访问所使用的本地名称(例如x)。如果我们只想“捕获”x,我们可以写[&x];如果我们想将的副本传递给生成的函数对象,我们可以编写[x]。什么都不捕获是[],捕获所有按引用访问的本地名称是[&],捕获所有按值访问的本地名称是[=]。并且lambda表达式还可以赋值给对应的函数指针,这也让你完全可以把lambda表达式当成对应函数类型的指针。当我们需要访问它的局部变量时,需要在捕获列表中具体定义类型下面是一个不使用局部变量的lambda表达式,所以它的[]为空voidpart(vector&v){sort(v.begin,v.end);//数组值sort(v.begin,v.end,[](intx,inty){returnabs(x)&v){boolvalue=true;sort(v.begin,v.end,[](intx,inty){returnvalue?xvoidvalue_capture(){intvalue=1;autocopy_value=[value]{returnvalue;};value=100;autostored_value=copy_value();std::cout<<"stored_value="<