Table of Contents

C++的Lambda表达式

Lambda表达式从C++11开始被支持。其作用是创建一个临时的函数。

C++11开始,有3种方法可以创建/传递可被调用的对象:

  1. 函数指针
  2. 仿函数(重载括号操作的类)
  3. Lambda表达式

完整语法

[ capture-list ] ( params ) mutable(optional) exception(optional) attribute(optional) -> ret(optional) { body }

解释:

  1. capture-list:捕获列表。
  2. params:和普通函数一样的参数。
  3. mutable:只有这个Lambda表达式是mutable的才允许修改按值捕获的参数。
  4. exception:异常标识。
  5. attribute:属性标识。
  6. ret:返回值类型,可以省略,让编译器通过return语句自动推导。
  7. body:函数的具体逻辑。

例子:

auto Plus = [](int a, int b) ->int { return a + b; };

捕获:

什么是捕获?
Lambda表达式的捕获,其实就是将局部自动变量保存到Lambda表达式内部。
Lambda表达式不能捕获全局变量或static变量。

捕获有两种方式
按值捕获([target])、按引用捕获([&target])

捕获列表初始化(C++14)
[v = target]、[&r = target]

默认捕获(不建议使用)
[=]表示按值捕获可见范围内的所有局部变量。
[&]表示按引用捕获可见范围内的所有局部变量。

按值捕获的类型是const的
如果要修改按值捕获的参数,需要将Lambda表达式声明为mutable的。

auto func = [i]() mutable {i = 200;};

捕获this指针
这是可行的,但是不能[&this]

Lambda可以像函数指针一样赋值