C++ lambda表达式的本质就是重载了 operator(),lambda是一个类,在调用时会进行编译展开。因此lambda表达式对象其实就是一个匿名的functor,所以 lambda 表达式 也叫匿名函数对象。
C++中lambda表达式的构成一个标准的lambda表达式包括:捕获列表、参数列表、mutable指示符、异常列表、返回类型(->返回类型)和函数体:
[捕获列表] (形参列表) mutable 异常列表-> 返回类型
{
函数体
}
各项的含义:
-
捕获列表:捕获外部变量,捕获的变量可以在函数体中使用,可以省略,即不捕获外部变量。
-
形参列表:和普通函数的形参列表一样。可省略,即无参数列表
-
mutable:mutable 关键字,如果有,则表示在函数体中可以修改捕获变量,根据具体需求决定是否需要省略。
-
异常列表:noexcept / throw(...),和普通函数的异常列表一样,可省略,即代表可能抛出任何类型的异常。
-
返回类型:和函数的返回类型一样。可省略,如省略,编译器将自动推导返回类型。
-
函数体:代码实现。可省略,但是没意义。
由于lambda表达式是在某函数内定义的,因此我们可能希望其能使用函数内的局部变量,这时则可以使用所谓捕获列表。总体说来,一共有三种捕获方式:值捕获、引用捕获和外部捕获。
值捕获
值捕获和参数传递中的值传递类似,被捕获的变量的值在Lambda表达式创建时通过值拷贝的方式传入,因此随后对该变量的修改不会影响影响Lambda表达式中的值。注意,不能在lambda表达式中修改捕获变量的值。代码如下:
#include
using namespace std;
int main()
{
int nCapture = 13;
auto f = [nCapture](int a, int b) -> int
{
//nCapture = 134; //不能在lambda表达式中修改捕获变量的值
return a + b + nCapture;
};
cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?