C++11 匿名函数(lambda)详解
匿名函数是许多编程语言都支持的概念,有函数体,没有函数名,C++引入了lambda函数,你可以在源码中内联一个lambda函数,这使得创建更简单更快速。
1 |
|
1 | [capture_block](parameters) mutable exception_specification->return_type{ body } |
捕捉块(capture clock):指定如何捕捉所在作用域中的变量,并供给lambda主体使用。
参数(parameter):(可选)lambda表达式使用的参数列表。只有在不使用任何参数,并且没有自定mutable、一个exception_specification
和 一个return_type
的情况下可以忽略该列表,返回类型在某些情况下也是可以忽略的,详见对return_type的说明:eg: []{return 10;}
参数列表和普通函数的参数列表类似,区别如下:
- 参数不能有默认值。
- 不允许变长参数列表。
- 不允许未命名的参数。
mutable: (可选)如果所在作用域的变量是通过值捕捉到,那么lambda表达式主体中可以使用这些变量的副本。这些副本默认标记为const,因此lambda表达式的主体不能修改这些副本的值。如果lambda表达式标记为mutable,那么这些副本则不是const,因此主体可以修改这些本地副本。
exception_sepcification:(可选)用于指定lambda可以跑出的异常。
return_type:(可选)返回值的类型。如果忽略了return_type
,那么编译器会根据以下原则判断返回类型:
- 如果lambda表达式主体的形式为{ return expression; }那么表达式
return_type
的类型为expression的类型。其他情况下的return_type
为void。
lambda函数能够捕获lambda函数外的具有自动存储时期的变量。函数体与这些变量的集合合起来叫闭包。
- [] 不截取任何变量。
- [&] 截取外部作用域中所有变量,并作为引用在函数体中使用。
- [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用。
- [=, &foo] 截取外部作用域中所有变量,并拷贝一份函数体中使用,但是对foo变量使用引用。
- [bar] 截取bar变量并拷贝一份在函数体中使用,同时不截取其他变量。
- [x, &y] x按值传递,y按引用传递。
- [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。