C++11之lambda

作者: Hard模式 | 来源:发表于2018-07-09 17:35 被阅读0次

    lambda函数的语法如下:

    [capture list] (parameter list) -> return type { function body }
    

    [] capture list

    捕获列表,定义了lambda函数如何引用上下文中既有变量。分传值和引用两种方式,默认为传值。

    Example Comment
    [] 沒有定义任何变量。使用未定义变量会引发错误。
    [x, &y] x以传值方式传入(默认),y以引用方式传入。
    [&] 任何被使用到的外部变量都隐式地以引用方式加以引用。
    [=] 任何被使用到的外部变量都隐式地以传值方式加以引用。
    [&, x] x显式地以传值方式加以引用。其余变量以引用方式加以引用。
    [=, &z] z显式地以引用方式加以引用。其余变量以传值方式加以引用。

    举个栗子!

    int a, b, c;
    []( int x, int y ) { return a+x; } // Error! a不在捕获列表中,不能引用a!
    [a]( int x, int y ) { return a+x; } // OK.
    [a]() { a=a+1; return a; } // Error! a是传值方式,不能修改其值。
    [&a]() { a=a+1; return a; } // OK.
    [&, a]() { ... }   // a以传值方式捕获,b,c以引用捕获
    [=, a]() { ... }   // a以引用方式捕获,b,c以传值捕获。
    

    注意一下,如果要使用lambda函数的函数指针,捕获列表必须为空[]

    bool(*fp)(int, int)=[](int a,int b) { return a>b; };  //不捕获时才可转换为函数指针
    

    () parameter list

    参数列表,类似普通函数的参数列表。

    ->return type

    函数返回类型,可省略,C++会自动推导返回类型,默认是int.
    注意,只有在lambda函数匹配"return expression"的形式下,它的返回类型才能被忽略。

    [](int x,int y)->int { int z=x+y; return z+x; }
    

    { function body }

    Nothing special // \笑脸

    其他

    1. lambda函数是编译器从属类型的函数对象;这种类型名称只有编译器自己能够使用。
      如果用户希望将lambda函数作为参数传入,该类型必须是模版类型,或是必须创建一个std::function去获取lambda的值。
      但是使用auto关键字让我们能够更简便地存储lambda函数:
    auto myLambdaFunc = [this]() { this->SomePrivateMemberFunction(); };
    auto myOnheapLambdaFunc = new auto([=] { /*...*/ });
    
    1. 定义在与lambda函数相同作用域的参数引用也可以被使用。这种的参数集合一般被称作closure(闭包)。

    参考资料:
    wiki
    百度百科

    相关文章

      网友评论

        本文标题:C++11之lambda

        本文链接:https://www.haomeiwen.com/subject/nznyyftx.html