什么是 C++ 中的 Lambda 表达式?Lambda 表达式可以捕获哪些类型的变量?有哪些捕获方式?
1) 什么是 C++ 中的 Lambda 表达式?它的作用是什么?
Lambda 表达式 是 C++11 引入的一种定义匿名函数对象的方式。它允许你在代码中直接定义短小的函数对象,而不需要显式地定义一个类或者函数。Lambda 表达式通常用于需要传递函数对象作为参数的场景,或者在局部范围内需要临时定义一个函数对象时使用。
作用:
- 简化代码:在需要传递函数作为参数或者回调函数的场景中,Lambda 表达式可以显著减少代码量。
- 提高可读性:在需要定义一次性使用的简单函数时,Lambda 表达式可以让代码更加紧凑和直观。
- 方便捕获上下文:Lambda 表达式可以捕获其所在作用域中的变量,使得函数对象可以访问和操作这些变量。
2) Lambda 表达式可以捕获哪些类型的变量?有哪些捕获方式?
捕获类型:
- 值捕获:Lambda 表达式通过值的方式捕获变量,即复制变量的值。
- 引用捕获:Lambda 表达式通过引用的方式捕获变量,即使用变量的引用。
- 按表达式捕获:C++14 引入的一种捕获方式,允许在捕获时执行表达式(例如
[=, &x](...) { ... }
中=
表示值捕获所有外部变量,而&x
表示按引用捕获x
)。
捕获方式:
- 值捕获 (
[=]
):- Lambda 表达式以值的方式捕获其所在作用域中所有可见的变量。
- 示例:
[=](int a) { return a + x; }
,其中x
是捕获的变量。
- 引用捕获 (
[&]
):- Lambda 表达式以引用的方式捕获其所在作用域中所有可见的变量。
- 示例:
[&](int a) { x = a + 1; }
,其中x
是捕获的变量。
- 显式捕获:
- 允许显式指定哪些变量以值捕获,哪些以引用捕获。
- 示例:
[x, &y](int a) { return x + y + a; }
,其中x
是值捕获,y
是引用捕获。
- 无捕获 (
[]
):- 不捕获任何变量。
- 示例:
[](int a, int b) { return a * b; }
。
- 按表达式捕获 (
[=, &x]
或[&, x]
):- C++14 引入的特性,允许混合捕获方式,并且可以在捕获时进行表达式计算。
- 示例:
[=, x * 2](int a) { return x_double + a; }
,其中x_double
是x * 2
的结果,x
是按值捕获的变量。
通过这些捕获方式,Lambda 表达式可以灵活地控制对外部变量的访问,使代码更加简洁和高效。