首页 > 代码库 > C++11之lambda函数

C++11之lambda函数

  lambda来源于函数式编程的概念,也是现代语言编程的特点。

  首先看看lambda的基本用法:

1 [capture] (params) opt->return {body;}

  其中, capture 是捕获列表(即闭包中的自由变量):

  • [] 不截取任何变量
  • [&] 截取外部作用域中所有变量,并作为引用在函数体中使用
  • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
  • [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
  • [bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
  • [x, &y] x按值传递,y按引用传递
  • [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。

  params 是参数表;opt是函数选项;return是返回值类型;body是函数体。 

  lambda表达式的类型在C++11中被称之为“闭包类型”。我们可以认为它是一个带有operator()的类。因此,可以使用 std::function 和 std::bind 来存储其类型:

1 std::function<int(int)> f1 = [](int i) {return i; };
2 std::function<int(void)> f2 = std::bind([](int a){ return a; });

  

1 int a = 0;
2 int b = 1;
3 auto f1 = []{return a; };  //error,没有捕获外部变量 
4 auto f2 = [&]{return a++; };
5 auto f3 = [=]{return a; };
6 auto f4 = [=]{return a++; };  //error,a是以复制方式捕获的,无法修改
7 auto f5 = [a]{return a + b; };  //error,没有捕获变量b
8 auto f6 = [a, &b]{return a + (b++); };
9 auto f7 = [=, &b]{return a + (b++); };

 

  举个栗子:

std::vector<int> v = {1, 2, 3, 4};
int sum = 0;
for_each(v.begin(), v.end(), [&sum](int value) {
    sum += value;
});
std::cout << "sum:" << sum << endl;

  lambda表达式还是比较简单的,理解闭包之后就能轻松地用好lambda啦。

C++11之lambda函数