1 什么是lambda表达式

C++ Lambda表达式是一种匿名函数,它可以像变量一样被定义、传递和赋值,大大简化了C++的编程过程。

Lambda表达式的语法形式如下:

[capture-list] (parameters) -> returntype {statement}
  • [capture-list]:捕获列表,该列表总是出现在lambda函数的开始位置,编译器根据 [] 来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。

  • (parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略。

  • ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。

  • {statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

例如:

auto add = [](int a, int b) -> int {
    return a + b;
};//通常用auto来接收
std::cout << add(2, 3); // 输出 5

注意: 在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空。因此C++11中最简单的lambda函数为:[]{}; 该lambda函数不能做任何事情。

2 捕获列表

在 C++ 中,Lambda 表达式可以使用捕获列表来指定它如何访问在其外部作用域中的变量。捕获列表可以包含以下元素:

  • [ ] 表示不捕获任何变量

  • [var] 表示值传递方式捕捉变量var

  • [=] 表示值传递方式捕获所有父作用域中的变量(包括this,此时this传递的是指针)

  • [&var] 表示引用传递捕捉变量var

  • [&] 表示引用传递捕捉所有父作用域中的变量(包括this,此时this传递的是指针)

  • [*this] 表示值传递方式捕捉当前的this指针(因为this是指针,所以*this才是值)

  • [this] 引用传递,也就是指针赋值给lambda表达式局部变量this(传递的是指针)

3 捕获列表分析

3.1 关于this

  • [*this]:这是值传递,因为this是指针,*this*就表示值。不可修改函数内部this。(const A *this)

    alt text

  • [this]:引用传递。

    alt text

  • [=]和[&]:对于this都是引用传递。

参考

参考1:C++lambda表达式