C++11之lambda

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
百度百科

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容