您可以使用类方法的主体中的 lambda 表达式。 通过this捕获子句可访问到封闭类的方法和数据成员的指针。 有关如何对类方法中使用 lambda 表达式的示例,请参阅示例: 在该主题中的某个方法中使用 Lambda 表达式Lambda表达式的示例。
Dd293603.collapse_all(zh-cn,VS.110)。gif参数列表
Lambda 表达式的参数列表与类似的参数列表的函数,但以下情况除外:
参数列表中不能有默认参数。
参数列表中不能有一个可变长度参数列表。
参数列表中不能有未命名的参数。
Lambda 表达式可以采取另一个 lambda 表达式作为其参数。 详细信息,请参阅高序位 Lambda 表达式主题中的Lambda表达式的示例。
Lambda 表达式的参数列表是可选的。 如果未将参数传递到 lambda 表达式,并且未提供,则可以省略的参数列表mutable-specification, exception-specification,和lambda-return-type-clause元素。 下面的示例演示省略的参数列表的 lambda 表达式:
// lambda_parameter_list.cpp
int main()
{
int x = 4;
int y = 5;
int z = [=] { return x + y; }();
}
Dd293603.collapse_all(zh-cn,VS.110)。gif可变的技术指标
可变规范部分可以修改变量值捕获的 lambda 表达式的主体。 上面的示例使用mutable关键字,以便将 lambda 表达式的主体可以修改其副本的外部变量的x和y,可通过值来捕捉的 lambda 表达式。 由于 lambda 表达式捕获变量x和y的数值,保持它们的值1调用后generate_n.
Dd293603.collapse_all(zh-cn,VS.110)。gif异常规范
您可以使用throw()异常详细信息,以指示将 lambda 表达式不会引发任何异常。 根据常规的功能,使用 Visual C++ 编译器将生成警告 C4297 如果 lambda 表达式声明throw()异常规范和 lambda 主体引发异常,如下面的示例中所示:
// throw_lambda_expression.cpp
int main() // C4297 expected
{
[]() throw() { throw 5; }();
}
有关异常规范的详细信息,请参阅异常规范。
Dd293603.collapse_all(zh-cn,VS.110)。gifReturn Type
Lambda 表达式的返回类型一部分类似于普通的方法或函数的返回类型部分。 但是,返回类型后面的参数列表,并且必须包括->的返回类型之前。
如果 lambda 正文包含一个返回语句或 lambda 表达式不会返回一个值,则可以省略 lambda 表达式的返回类型部分。 如果 lambda 主体包含一个返回语句,编译器将 deduces 从返回的表达式的类型的返回类型。 否则,编译器 deduces 返回类型是void.
Lambda 表达式可能产生另一个 lambda 表达式作为它的返回值。 详细信息,请参阅高序位 Lambda 表达式主题中的Lambda表达式的示例。
Dd293603.collapse_all(zh-cn,VS.110)。gifLambda 主体
Lambda 正文部分的 lambda 表达式可以包含普通的方法或函数的主体可以包含任何内容。 普通函数和 lambda 表达式的主体可以访问以下类型的变量:
参数
本地声明的变量
类的数据成员 (当在类内声明的)
任何具有静态存储持续时间 (例如,全局变量) 的变量
此外,lambda 表达式可以访问它从封闭范围内捕获的变量。 变量是显式捕获的 lambda 表达式捕获子句中出现。 否则,该变量是隐式地捕获。 Lambda 表达式的正文使用隐式地捕获访问变量的默认捕获模式。
lambda_parameter_list.cpp示例隐式地捕获局部变量x和y的值。 下面的示例包含 lambda 表达式显式捕获该变量的n通过值和隐式地捕获变量m通过引用:
// captures_lambda_expression.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main()
{
int m = 0, n = 0;
[&, n] (int a) mutable { m = ++n + a; }(4);
cout 《 m 《 endl 《 n 《 endl;
}
本示例将以下内容显示在控制台:
5
0
因为该变量n被捕获的数值,其值将保持0的 lambda 表达式在调用之后。
尽管 lambda 表达式可以只捕获自动存储持续时间的变量,您可以使用 lambda 表达式的正文中的静态存储持续时间的变量。 下面的示例使用generate函数,lambda 表达式中的每个元素赋值vector对象。 Lambda 表达式修改静态变量来生成的下一个元素的值。
// lambda_static_variable.cpp
// compile with: /c /EHsc
#include <vector>
#include <algorithm>
using namespace std;
void fillVector(vector<int>& v)
{
// A local static variable.
static int nextValue = 1;
// The lambda expression that appears in the following call to
// the generate function modifies and uses the local static
// variable nextValue.
generate(v.begin(), v.end(), [] { return nextValue++; });
}