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 表达式。