lambda表达式学习笔记.doc

  1. 1、本文档共2页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Lambda表达式 Lambda表达式允许你在本地定义函数,即在调用的地方定义,从而消除函数对象产生的许多安全风险,Lambda表达式的格式如下: [capture](parameters)-return-type?{body}(para_list) []里是函数调用的引入符,表示一个Lambda表达式的开始, 作用: Lambda 表达式就是用于创建匿名函数的。GCC 4.5.x 和 Microsoft Visual Studio 早已提供了对 lambda 表达式的支持。在 GCC 4.7 中,默认是不开启 C++ 11 特性的,需要添加 ?-std=c++11 编译参数。而 VS2010 则默认开启。 分段详解: [capture]: lambda表达式的引入符号_必须存在 Lambda所有出现的 lambda 引入符总结: []? ? ? ? // 不捕获任何外部变量 [=]? ? ? // 以值的形式捕获所有外部变量 []? ? ? // 以引用形式捕获所有外部变量 [x, y]?// x 以传值形式捕获,y 以引用形式捕获 [=, z]// z 以引用形式捕获,其余变量以传值形式捕获 [, x]? // x 以值的形式捕获,其余变量以引用形式捕获 this显示传入:对于[=]或[]的形式,lambda 表达式可以直接使用 this 指针。但是,对于[]的形式,如果要使用 this 指针,必须显式传入:[this]() { this-someFunc(); }(); (parameters): 函数的参数定义 : -return-type: 函数的返回类型定义——可以为空,类型自动推导 ?{body}?:函数结构体 (para_list):参数列表——可以为空 拷贝的例子: 例子1:值传递外部参数 float f0 = 1.0; std::cout [=](float f) { return f0 + std::abs(f); } (-3.5); 结果为:4.5 f0等于1.0 例子2:引用传递外部参数 float f0 = 1.0; std::cout [](float f) { return f0 += std::abs(f); } (-3.5); std::cout \n f0 \n; 返回值为4.5 输出为4.5 :引用外部变量f0 例子3:mutable关键字的使用 :float f0 = 1.0; std::cout [=](float f) mutable { return f0 += std::abs(f); } (-3.5); std::cout \n f0 \n; 返回值4.5 输出值仍未1.0,原因如下: 首先,[=]意味着,lambda 表达式以传值的形式捕获外部变量。C++ 11 标准说,如果以传值的形式捕获外部变量,那么,lambda 体不允许修改外部变量,对 f0 的任何修改都会引发编译错误。但是,注意,我们在 lambda 表达式前声明了mutable关键字,这就允许了 lambda 表达式体修改 f0 的值。因此,我们的例子本应报错,但是由于有 mutable 关键字,则不会报错。那么,你会觉得输出值是什么呢?答案是,4.5 和 1.0。为什么 f0 还是 1.0?因为我们是传值的,虽然在 lambda 表达式中对 f0 有了修改,但由于是传值的,外部的 f0 依然不会被修改。 例子4:混合引用外部参数 float f0 = 1.0f; float f1 = 10.0f; std::cout [=, f0](float a) { return f0 += f1 + std::abs(a); } (-3.5); std::cout \n f0 \n; 返回值: 14.5 输出值: 14.5。在这个例子中,f0?通过引用被捕获,而其它变量,比如?f1?则是通过值被捕获。 例子5: 匿名函数带返回值 std::cout [](float f) - int { return std::abs(f); } (-3.5); 输出结果为3-int函数返回值强制转化为INT型,lambda 表达式的返回时不是 float 而是 int。返回值类型的概念同普通的函数返回值类型是完全一样的。 引用来自豆子的博客,学习QT5.1帮了很大忙 /category/qt-study-road-2/

您可能关注的文档

文档评论(0)

星愿 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档