C++ Lambda表达式的用法(附带实例)
C++11 中的 Lambda 表达式是一种用于创建匿名函数对象(也称为闭包)的简洁的语法。
Lambda 表达式允许程序员在代码中定义并使用小段的代码,而这些代码可以像函数一样被调用,同时也可以访问并操作其外部作用域的变量。
Lambda 表达式的基本语法如下:
捕获列表有值捕获、引用捕获、混合捕获和默认捕获:
1) 通过值捕获使用“=”来捕获所有外部变量,并通过值的方式传递给 Lambda 函数体。在函数体内,这些变量是常量,不能被修改,示例代码如下:
2) 通过引用捕获使用 & 来捕获所有外部变量,并通过引用的方式传递给 Lambda 函数体。在函数体内,这些变量可以像普通变量一样被修改,示例代码如下:
3) 混合捕获同时使用 = 和 & 来捕获不同的变量,或者使用明确的变量名来指定哪些变量被捕获,示例代码如下:
4) 默认捕获使用空的捕获列表来捕获所有外部变量,这实际上是 = 和 & 的混合体。对于非静态成员变量,它使用引用捕获;对于其他所有变量使用值捕获,示例代码如下:
当缺省了返回值类型时,编译器会根据最后的 return 语句自动地推导出返回值类型,代码如下:
Lambda 表达式允许程序员在代码中定义并使用小段的代码,而这些代码可以像函数一样被调用,同时也可以访问并操作其外部作用域的变量。
Lambda 表达式的基本语法如下:
[capture_list](parameter_list)body->return_type
- capture_list(捕获列表)定义了 Lambda 表达式可以访问和修改的外部变量的范围。这个列表可以包括 this,它使 Lambda 表达式可以访问类的成员。如果列表为空,则只有 this 和 extern 变量可以访问;
- parameter_list 定义了 Lambda 表达式的参数。它们可以在 Lambda 表达式的主体内部使用;
- body 是 Lambda 表达式的主体。它是一段代码,可以包括函数调用、循环、条件语句、返回语句等;
- return_type 表示 Lambda 表达式的返回值类型,这一部分是可以缺省的。
捕获列表有值捕获、引用捕获、混合捕获和默认捕获:
1) 通过值捕获使用“=”来捕获所有外部变量,并通过值的方式传递给 Lambda 函数体。在函数体内,这些变量是常量,不能被修改,示例代码如下:
auto lambda = [=](){
//在这里,所有外部变量都可以通过值访问,但不能修改
};
2) 通过引用捕获使用 & 来捕获所有外部变量,并通过引用的方式传递给 Lambda 函数体。在函数体内,这些变量可以像普通变量一样被修改,示例代码如下:
auto lambda = [&](){
//在这里,所有外部变量都可以通过引用进行访问和修改
};
3) 混合捕获同时使用 = 和 & 来捕获不同的变量,或者使用明确的变量名来指定哪些变量被捕获,示例代码如下:
int x = 10;
int& ref = x;
const int& cref = x;
auto lambda = [x,&ref,cref](){
//在这里,x通过值捕获,ref和cref通过引用捕获
//x是只读的,而ref和cref可以修改
};
4) 默认捕获使用空的捕获列表来捕获所有外部变量,这实际上是 = 和 & 的混合体。对于非静态成员变量,它使用引用捕获;对于其他所有变量使用值捕获,示例代码如下:
auto lambda = [](){
//在类的成员函数中使用,捕获当前对象的所有成员变量
//非静态成员变量通过引用来捕获,其他变量通过值来捕获
};
当缺省了返回值类型时,编译器会根据最后的 return 语句自动地推导出返回值类型,代码如下:
auto add =[](int a,int b){return a + b;};
int main()
{
int result = add(3,5);
std::cout<< result<< std::endl;//Output:8
return 0;
}
在这个例子中定义了一个 Lambda表达式[](int a, int b){return a+b;},并将其赋值给一个变量 add,然后可以在 main() 函数中像调用普通函数一样调用这个 Lambda 表达式。
ICP备案:
公安联网备案: