3. 说一下你了解的lambda表达式?

Lambda 表达式实际上就是提供了⼀个类似匿名函数的特性,⽽匿名函数则是在需要⼀个函数,但是⼜不想费力去命名⼀个函数的情况下去使⽤的。

一个 Lambda 表达式的结构,一般是从方括号【】开始,然后结束于花括号{},花括号里面就像定义函数一样,包含 lambda 表达式体,一个最简单的 lambda 表达式例子如下:

  1. auto basicLambda = [] { cout << "basic lambda" << endl; };
  2. basicLambda(); // output: basic lambda

最前面的 【】是 lambda 表达式的一个很重要的功能,就是闭包

2> lambda 表达式的原理
每当定义一个 lambda 表达式后,编译器就会自动生成一个匿名类,即我们称之为闭包类型(closure type)。
运行时, 该 lambda 表达式就会返回一个匿名的闭包示例,就是一个右值,所以上述 lambda 表达式的结果就是一个闭包示例。

闭包的⼀个强大之处是其可以通过传值或者引用的方式捕捉其封装作用域内的变量,前⾯的方括号就是⽤来定义捕捉模式以及变量,我们⼜将其称为 lambda 捕捉块。例⼦如下:

  1. int main() {
  2. int x = 10;
  3. auto add_x = [x](int a) { return a + x; }; // 复制捕捉x, lambda 表达式⽆法修改此变量
  4. auto multiply_x = [&x](int a) { return a * x; }; // 引⽤捕捉x,lambda表达式可以修改此变量
  5. cout << add_x(10) << " " << multiply_x(10) << endl;
  6. // 输出:20 100
  7. return 0;
  8. }

参考: c++ lambda表达式总结

3.1 追问:lambda表达式一般应用在什么场景?

智能指针删除器.