zoukankan      html  css  js  c++  java
  • 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
Copyright © 2011-2022 走看看