C++ Lambda 函数与表达式
C++11 提供了对匿名函数的支持,称为 Lambda 函数( 也叫 Lambda 表达式 )
Lambda 表达式 把 函数 看作 对象
Lambda 表达式 可以像对象一样使用, 可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值
Lambda 表达式声明
声明 Lambda 表达式与函数声明非常类似
Lambda 表达式的声明形式如下
[capture](parameters) -> return-type { //body }
capture是可选的,后面讲如何使用parameters为表达式的参数,类似于函数中的形参return-type返回值类型
例如下面的代码声明了一个比较 int 类型变量 x,y 大小的 Lambda 表达式
[](int x, int y) -> bool { return x < y ; }
如果 lambda 函数没有传回值 ( 例如 void ) ,回返类型可被完全忽略
[capture](parameters){ // body }
如果连参数不需要传递,还可以写成
[capture](){ // body }
例如
[]{ ++global_x; }
我们来看看一个更复杂的代码
[](int x, int y) -> int { int z = x + y; return z + x; }
一个临时的参数 z 被创建用来存储中间结果
如同一般的函数,z 的值不会保留到下一次该不具名函数再次被调用时
Lambda 表达式中的 [capture]
Lambda 表达式内可以访问当前作用域的变量,这是 Lambd a表达式的闭包 (Closure ) 行为
因为 C++ 变量传递有传值和传引用的区别,所以使用当前作用域内的变量方式可以通过前面的 []来指定
| capture | 说明 |
|---|---|
| [] | 沒有定义任何变量。使用未定义变量会引发错误 |
| [x, &y] | x 以传值方式传入(默认),y 以引用方式传入 |
| [&] | 任何被使用到的外部变量都隐式地以引用方式加以引用 |
| [=] | 任何被使用到的外部变量都隐式地以传值方式加以引用 |
| [&, x] | x 显式地以传值方式加以引用。其余变量以引用方式加以引用 |
| [=, &z] | z 显式地以引用方式加以引用。其余变量以传值方式加以引用 |
对于 [=] 或 [&] 形式,lambda 表达式可以直接使用 this 指针
但是,对于 [] 形式,如果要使用 this 指针,必须显式传入
[this]() { this->someFunc(); }();