C++ Lambda 表达式
C++11 标准引入了对匿名函数的支持,称为 Lambda 函数,也叫 Lambda 表达式。利用 Lambda 表达式 ,就可以很方便地定义和创建匿名函数。
虽然“Lambda 表达式”或“匿名函数”对 C++ 来说是“新玩意儿”,但其实很多高级语言在很早以前就已经提供了 Lambda 表达式的功能,比如 Python、C# 等等。
在 C++ 中,Lambda 表达式把函数看作对象,我们可以像使用对象一样使用 Lambda 表达式,也可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。
声明 Lambda 表达式
Lambda 表达式的声明与函数声明非常类似,语法格式如下:
[capture list] (params list) mutable exception-> return type { function body }
各项具体含义如下:
capture list
:捕获外部变量列表(可选的)params list
:参数列表(可选的,类似于函数中的形式参数)mutable
指示符:用于说明是否可以修改捕获的变量exception
:异常设定return type
:返回值类型function body
:函数体
通过省略其中某些成分,常见的 Lambda 表达式声明有以下几种:
序号 | 格式 |
---|---|
① | [capture list] (params list) -> return type { function body } |
② | [capture list] (params list) { function body } |
③ | [capture list] { function body } |
其中,格式 ① 声明了 const 类型的表达式,这种类型的表达式不能修改捕获列表中的值。
格式 ② 省略了返回值类型,但编译器可以根据以下规则推断出 Lambda 表达式的返回类型:
- 如果 function body 中存在 return 语句,则该 Lambda 表达式的返回类型由 return 语句的返回类型确定;
- 如果 function body 中没有 return 语句,则返回值为 void 类型。
格式 ③ 中省略了参数列表,类似普通函数中的无参函数。
示例:下面的代码声明了一个比较 int
类型变量 x
,y
大小的 Lambda 表达式。
[](int x, int y) -> bool { return x < y ; }
示例:一个简单的 Lambda 表达式。
[]{ ++global_x; }