cpp的lambda表达式
在C++中,lambda表达式提供了一种方便的方式来定义匿名函数。Lambda可以用来创建简单的函数对象,常用于算法库中的函数参数,特别是在STL(Standard Template Library)中。
Lambda表达式的语法是这样的:
[ capture ] ( parameters ) -> return-type {
function-body
}
其中:
- capture:捕获列表,用于指定哪些变量从封闭的作用域中捕获以及如何捕获(值捕获、引用捕获、不捕获、隐式捕获)。例如,
[x, &y]
表示x
通过值捕获,而y
通过引用捕获。 - parameters:参数列表,与普通函数的参数列表类似。如果没有参数,可以省略或者写成空括号
()
。 - return-type:返回类型。自C++14起,如果lambda函数体只包含一个
return
语句,或者返回类型显而易见,则可以省略返回类型,编译器会进行自动推断。 - function-body:函数体,包含了lambda的执行语句。
下面是一些lambda表达式的示例:
示例 1:无参数,简单的打印
auto printHello = []() {
std::cout << "Hello, World!" << std::endl;
};
printHello(); // 调用lambda表达式
示例 2:使用参数和返回值
auto add = [](int x, int y) -> int {
return x + y;
};
std::cout << add(5, 3) << std::endl; // 输出8
示例 3:值捕获外部变量
int z = 4;
auto addZ = [z](int x) -> int {
return x + z; // z通过值捕获进来
};
std::cout << addZ(3) << std::endl; // 输出7
示例 4:引用捕获外部变量
int w = 4;
auto modifyW = [&w](int x) {
w = x; // w通过引用捕获,可以修改其值
};
modifyW(5);
std::cout << w << std::endl; // 输出5
Lambda表达式是C++11及以后版本中的一个强大特性,它大大简化了代码的编写,尤其是在需要使用临时函数对象的场合。
为什么要使用auto?
因为lambda表达式的实际类型是一个匿名函数类型,不方便直接声明
不使用auto来声明lambda匿名函数
在C++中,每个Lambda表达式都有一个独一无二的、编译器生成的类型。因此,我们通常不能不使用auto
直接声明一个Lambda表达式的变量类型,除非我们使用C++11之后的标准模板库中引入的std::function
来包装该Lambda表达式。
示例: 使用std::function声明add
#include <functional>
// 使用std::function来声明add变量,避免使用auto。
std::function<int(int, int)> add = [](int a, int b) {
return a + b;
};
在这个示例中,我们使用std::function
来指定add变量的类型。std::function<int(int, int)>
指明了add
是一个函数,它接受两个int
参数并返回一个int
结果。