C++11 引入了 lambda 表达式,它是一种用于创建匿名函数的语法。Lambda 表达式提供了一种更加简洁和灵活的方式来编写函数对象,尤其适用于需要传递函数作为参数的情况,比如 STL 算法、函数式编程、事件处理等。
Lambda 表达式的基本语法
Lambda 表达式的一般形式如下:
1
| [capture](parameters) -> return_type { body }
|
capture
:捕获列表,用于捕获外部变量,可以是值捕获、引用捕获或混合捕获。
parameters
:参数列表,与普通函数的参数列表类似,可以为空。
return_type
:返回类型,可以省略,由编译器自动推导。
body
:函数体,与普通函数体相似,可以包含一系列语句或表达式。
Lambda 表达式的用法示例
1 2
| auto sum = [](int a, int b) { return a + b; }; int result = sum(3, 4);
|
1 2
| std::vector<int> numbers = {1, 2, 3, 4, 5}; int total = std::accumulate(numbers.begin(), numbers.end(), 0, [](int a, int b) { return a + b; });
|
1 2
| std::vector<int> numbers = {1, 2, 3, 4, 5}; std::for_each(numbers.begin(), numbers.end(), [](int num) { std::cout << num << std::endl; });
|
Lambda 表达式捕获列表
Lambda 表达式的捕获列表控制了它可以访问的外部变量。捕获列表可以为空,也可以包含一个或多个变量。捕获列表支持值捕获、引用捕获和混合捕获。
- 值捕获: 捕获外部变量的值,在 lambda 表达式创建时复制该变量的值。
1 2
| int x = 10; auto func = [x]() { return x; };
|
- 引用捕获: 捕获外部变量的引用,可以修改外部变量的值。
1 2
| int y = 20; auto func = [&y]() { y++; };
|
- 混合捕获: 混合使用值捕获和引用捕获。
1 2
| int x = 10, y = 20; auto func = [&x, y]() { return x + y; };
|
Lambda 表达式的返回类型推导
在 C++14 中,Lambda 表达式的返回类型可以由编译器根据其返回语句的类型自动推导。
1
| auto add = [](int a, int b) { return a + b; };
|