本主题描述的 lambda 表达式的语法。 它提供了一个示例,演示的 lambda 表达式,则这些元素的关联方式的结构元素。
下面的程序将在两个 STL 算法中使用 lambda 表达式: generate_n 和 for_each. 出现在 generate_n 函数调用中的 lambda 表达式将 vector 对象中的一个元素赋值为其前两个元素的和。 Lambda 表达式出现在调用for_each函数将打印元素相同的vector到控制台的对象。
C++
// lambda_structure.cpp
// compile with: /EHsc
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
// The number of elements in the vector.
const int elementCount = 9;
int main()
{
// Create a vector object with each element set to 1.
vector<int> v(elementCount, 1);
// These variables hold the previous two elements of the vector.
int x = 1;
int y = 1;
// Assign each element in the vector to the sum of the
// previous two elements.
generate_n(v.begin() + 2, elementCount - 2, [=]() mutable throw() -> int {
// Generate current value.
int n = x + y;
// Update previous two values.
x = y;
y = n;
return n;
});
// Print the contents of the vector.
for_each(v.begin(), v.end(), [](int n) { cout 《 n 《 " "; });
cout 《 endl;
// Print the local variables x and y.
// The values of x and y hold their initial values because
// they are captured by value.
cout 《 x 《 " " 《 y 《 endl;
}
有关详细信息generate_n函数,请参阅generate_n. 有关详细信息for_each函数,请参阅for_each.
以下各节描述的 lambda 表达式以及每个元素与前面的示例中的语法。
Lambda 表达式语法
下面的正式定义显示 BNF 格式,lambda 表达式的语法:
lambda 表达式
: lambda-introducer 参数声明(可选)复合语句
lambda-introducer
: [lambda-captureopt]
lambda 捕获
: 捕获默认
| 捕获列表
| 捕获默认 , 捕获列表
捕获默认
: &
| =
捕获列表
: 捕获
| 捕获列表 , 捕获
捕获
: 标识符
| & 标识符
| this
lambda 参数声明
: (lambda 参数声明列表自愿)可变规范自愿异常规范自愿 lambda 返回类型子句可选
lambda 参数声明列表
: lambda 参数
| lambda 参数 , lambda 参数声明列表
lambda 参数
: seq-decl-说明符声明符
lambda 返回类型子句
: ->type-id
下一节介绍了如何语法与中介绍的示例。
Lambda 表达式的属性
下图将映射到该示例的语法。
lambda 表达式的结构元素
在图中的标注,如下所示:
lambda introducer (称为捕获子句在本主题后面)
lambda 参数声明列表 (称为 参数列表在本主题后面)
可变规范 (称为 可变规范在本主题后面)
异常规范 (称为 异常规范在本主题后面)
lambda 返回类型子句 (称为 返回类型在本主题后面)
复合语句 (称为 lambda 主体在本主题后面)
以下各节介绍的语法的详细信息。
Dd293603.collapse_all(zh-cn,VS.110)。gif捕获子句
Lambda 表达式可以访问具有自动存储持续时间和封闭范围中的可访问的任何变量。 捕获子句指定是否将 lambda 表达式的主体通过值或引用访问封闭范围中的变量: 具有 & 符的变量 (&) 前缀的引用,并不具有的变量访问&前缀值的访问。 空捕获子句中, [],指示正文的 lambda 表达式访问封闭范围中的任何变量。
默认捕获模式指定显式指定的捕获变量捕获到通过值或引用。 您可以指定默认的捕获模式 (capture-default在语法) 通过指定&或=捕获子句的第一个元素。 & 元素指定除非显式指定,否则将 lambda 表达式的主体的访问通过引用所有捕获的变量。 = 元素指定除非显式指定,否则将 lambda 表达式的主体访问值的所有被捕获的变量。 例如,如果 lambda 表达式的主体访问外部变量total的引用和外部变量factor的数值,然后捕获以下子句是等效的:
[&total, factor]
[&, factor]
[=, &total]