是一种匿名函数对象,它结合了闭包和函数对象的概念。Lambda表达式在C++11中被引入,并在后续的C++标准中不断增强。它们通常用于简化代码,尤其是在处理临时或小型回调函数时。 Lambda表达式的语法
Lambda表达式的语法如下:
[capture](parameters) -> return_type { function_body };
- **捕获列表(capture list)**:用于指定可以从外部作用域捕获的变量。捕获可以按值或按引用进行。
- **参数列表(parameter list)**:定义lambda表达式的参数,类似于普通函数的参数列表。
- **返回类型(return type)**:指定lambda表达式的返回类型,可以省略,编译器会自动推导。
- **函数体(function body)**:包含lambda表达式的实际执行代码。
捕获方式
捕获列表决定了哪些外部作用域的变量可以在lambda表达式中使用。捕获方式包括:
- 按值捕获:使用变量名(如
[x]
),捕获变量的副本,变量在lambda表达式中是只读的,除非使用mutable
修饰符。 - 按引用捕获:使用变量名前加
&
(如[&x]
),捕获变量的引用,可以在lambda表达式中修改。 - 隐式捕获:使用
=
或&
,分别表示按值捕获所有变量或按引用捕获所有变量。可以混合使用具体的变量名和默认捕获模式。
Lambda表达式的应用场景
Lambda表达式在许多场景下都非常有用,包括:
- STL算法:如
std::sort
、std::transform
等,使用lambda表达式可以简化算法的使用。 - 异步编程:在多线程编程中,可以使用lambda表达式作为线程函数。
- 事件处理和回调函数:在GUI编程或网络编程中,可以使用lambda表达式作为事件处理器或回调函数,提高代码的可读性和可维护性。
泛型Lambda表达式
从C++14开始,Lambda表达式支持泛型参数。使用 auto
关键字可以创建一个接受任何类型参数的lambda表达式,例如:
auto add = [](auto a, auto b) { return a + b; };
这种泛型功能提高了代码的灵活性和重用性。
--------------------------------------------------------------------------