设为首页 加入收藏

TOP

C++ AMP: Lambda表达式语法(四)
2014-02-08 13:36:50 来源: 作者: 【 】 浏览:323
Tags:  AMP:  Lambda 表达式 语法

 

  您可以使用类方法的主体中的 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++; });

  }

      

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++中的explicit关键字 下一篇手游研发:博彩大转盘

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)