C++11-匿名函数(lambda)详解

C++11 匿名函数(lambda)详解

匿名函数是许多编程语言都支持的概念,有函数体,没有函数名,C++引入了lambda函数,你可以在源码中内联一个lambda函数,这使得创建更简单更快速。

1
2
3
4
5
6
7
8
9
10
#include <algorithm>
#include <cmath>

void abstract(float * x, unsigned N)
{
// Lambda expression
std::sort(x, x + N, [](float a, float b){
return std::abs(a) < std::abs(b);
});
}
1
2
3
[capture_block](parameters) mutable exception_specification->return_type{  body }

[capture](parameters)->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指针。如果已经使用了&或者=就默认添加此选项。
多谢您的大力支持