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(); }();