Lambda表达式

Lambda表达式

形式

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

说明

capture

需要捕获的外部变量列表(这里的外部变量不包括程序的全局变量,指的是匿名函数父作用域内的变量)。
如果这个匿名函数需要调用本匿名函数以外的变量,那么就需要在这个[ ] 中进行捕获,捕获包括捕获的变量名称和捕获的方式(值和引用)。
例如:

[ ] 表示不捕获外部的任何变量
[=] 表示捕获外部的所有变量(父作用域内),是以值的方式捕获(不可修改)。
[&] 表示捕获外部的所有变量(父作用域内),是以引用的方式捕获(可修改)。
[=, &x, &y] 表示捕获外部的所有变量(父作用域内),其中x和y以引用的方式捕获,其他变量以值的方式捕获。
[&, x, y]  表示捕获外部的所有变量(父作用域内),其中x和y以值的方式捕获,其他变量以引用的方式捕获。

capture注意事项

如果不进行变量捕获,那么在匿名函数内,不可以使用外部变量。
捕获列表内,不允许重复捕获。比如 [=, a],=已经说明所有的变量(包括a)以值的方式捕获,后边的a又进行了一次说明,这是不允许的。
捕获任何非父作用域内变量或者程序的全局变量,都会出错。
[this]只能以值的方式捕获

params

参数列表,就是和一般的函数一样的参数列表。

return-type

匿名函数的返回类型。
返回类型可以省略,c++11可以根据函数体内部的return 自动判断,当然,也可以指定返回类型。

总结

如果需要用到匿名函数外部的变量,就必须要进行捕获,需要注意捕获方式(值和引用),其他方面和一般的函数没有太大区别。