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