c++之—— lambda表达式(有个未能解决的问题等待大佬解答)——(在stack overflow找到了答案)
谓词:
谓词是一个可调用的表达式,其返回结果是一个能用作条件的值。标准库算法所使用的谓词分为两类:一元谓词,意味着它只接受单一参数;二元谓词,意味着它有两个参数。接受谓词参数的算法对输入序列中的元素调用谓词,因此,元素类型必须能转化为谓词的参数类型。典型例子如sort排序算法。
有时候,我们需要更多参数,超出了算法对谓词的限制。如果在编写划分序列的谓词时,可以不必为每个可能的大小都编写一个独立的谓词,显然更有实际价值。
我们可以向一个算法传递任何类别的可调用对象。对于一个对象或一个表达式,如果可以对其使用调用运算符,则称它为可调用的。到目前为止,我们使用过的仅有的两种可带哦用对象时函数和函数指针。还有其他两种可调用对象:重载了函数调用运算符的类以及lambda表达式。
与任何函数类似,一个lambda具有返回类型、参数列表和函数体。但与函数不同,lambda可能定义在函数内部。一个lambda表达式具有如下形式:
[capture list](parameter list) -> return type {fuction body}
capture list(捕获列表)是一个lambda所在函数中定义的局部变量的列表(通常为空)。与普通函数不同,lambda必须使用尾置返回来指定返回类型。
{
尾置返回类型:尾置返回类型跟在形参列表后面并以一个 -> 开头,为了表示函数真正的返回类型跟在形参列表之后,我们在本应该出现返回类型的地方放置一个auto,任何函数的定义都能使用尾置返回。
eg:
int (*func(int i) [10]);这是常见的声明,用尾置返回表示为:
auto func(int i) -> int(*)[10];
}
回到lambda表达式:
我们可以忽略参数列表和返回类型,但必须包含捕获列表的函数体:
auto f=[] {return 0;}
此例中,我们定义了一个可调用对象f,它不接受参数,返回0。lambda的调用方式与普通函数的调用方式相同,都是使用调用运算符:cout<<f()<<endl;打印0。在lambda中忽略括号和参数列表等价于指定一个空参数列表。在此例中,当调用f时,参数列表是空的。如果忽略返回类型,lambda根据函数体中的代码推断出返回类型。如果函数体只是一个return语句,则返回类型从返回的表达式的类型推断而来。否则,返回类型为void。
当然,lambda也可以有参数,但是与普通函数不同,lambda不能有默认参数,一个lambda调用的实参数目永远与形参数目相等。
#include<iostream>
using namespace std; int main()
{
auto f= [] (int a,int b){return a+b; };
cout << f(,) << endl; return ;
}
使用捕获列表:
虽然一个lambda可以出现在一个函数中,使用其局部变量,但它只能使用那些明确指明的变量。一个lambda通过局部变量包含在其捕获列表中来指出将会使用这些变量。捕获列表指引lambda在其内部包含访问局部变量所需的信息。
eg:
#include<iostream>
using namespace std; int main()
{
int a = ;
auto f= [a] (int ma){return a>ma; };
cout << f() << endl; return ;
}
但是,我遇到一个没有解决的问题,希望有知道的能够解答一下,万分感激。
代码如下:
{/*希望有人解答一下*/
也就是捕获的局部变量名和lambda的形参名一样,怎么区分呢?
我想它的形参的作用域内a是独立于外部局部变量a的,想知道有没有类似this一样的东西区分,因为这样的话我就必须要保证变量名不同。
}
/*3.23 update*/
http://stackoverflow.com/questions/42088015/lambda-capture-and-parameter-with-same-name-who-shadows-the-other-clang-vs-g
这篇帖子解决了我的问题,还是思考地不够深入,实际上是无名类重载调用运算符,那么参数a顺理成章隐藏捕获的a,由于捕获的是局部变量,所以不能通过域作用符去访问了,但是全局变量还可以,但lambda就是捕获局部变量的,因此,要捕获,请让lambda参数名和捕获名不同。
c++之—— lambda表达式(有个未能解决的问题等待大佬解答)——(在stack overflow找到了答案)的更多相关文章
- 掌握 Java 8 Lambda 表达式
Lambda 表达式 是 Java8 中最重要的功能之一.使用 Lambda 表达式 可以替代只有一个函数的接口实现,告别匿名内部类,代码看起来更简洁易懂.Lambda 表达式 同时还提升了对 集合 ...
- 30分钟入门Java8之lambda表达式
前言 Google在今年发布Android N开发者预览版,一并宣布开始支持Java 8.我们终于能在Android开发中使用到Java8的一些语言特性了.目前支持: 默认方法 lambda表达式 多 ...
- 死磕Lambda表达式(三):更简洁的Lambda
我们都是阴沟里的虫子,但总还是得有人仰望星空.--<三体> 在之前的文章中介绍了Lambda表达式的基本语法和正确使用姿势,这次我来介绍一些Lambda更简洁的用法. 欢迎关注微信公众号: ...
- Java Lambda表达式forEach无法跳出循环的解决思路
Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导 ...
- lambda表达式在解决java后台分组排序时的应用
需求:按照起始日期查询出数据库里一段连续日期的住院信息. 问题:数据库里的住院信息可能不是完整的,也就是在给出的日期区间里只有若干天的数据,缺少某些日期的数据. 解决: 1.需要我们先按日期分组查出数 ...
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...
- 释放Android的函数式能量(I):Kotlin语言的Lambda表达式
原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...
- Lambda表达式的诞生过程
这是一篇很经典的文章,解决了工作中一些使用过但是又不太明白的知识点,今天终于弄明白了.花了一晚上重新整的,坚决要分享出来!!! 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的 ...
随机推荐
- xml DTD中的ELEMENT和ATTLIST
是W3C的一个文档类型定义规则文件,是用来让浏览器根据你定义的DTD(文档类型定义)来解释页面代码的. doctype声明指出阅读程序应该用什么规则集来解释文档中的标记.在Web文档的情况下,“阅读程 ...
- JVM heap中各generation的大小(Sizing the Generations)
查看参数 使用 -XX:+PrintFlagsFinal 打印当前环境JVM参数默认值, 比如: java -XX:PrintFlagsFinal -version, 也可以用java [生产环境参数 ...
- PmException--- SQL(统计报表)
select TAGS,GROUP_CONCAT(TAGS) t from EXCEPTION_RESULT e,PM_TASK t ' and t.OWNER='admin' group by TA ...
- openvpn服务端一键生成windows,macos客户端配置文件
#!/bin/bash #获取参数 while getopts "n:" opt; do case $opt in n) client_name=$OPTARG ;; \?) ;; ...
- ios block常见的错误(一)
Block是OC中的一种数据类型,在iOS开发中被广泛使用. 在实际的使用和面试过程中,经常发现同事或面试者对block了解得不够透彻,本博文将列举常见block错误来对其加深理解. 示例代码1: ; ...
- Linux GPIO子系统
一 概述 Linux内核中gpio是最简单,最常用的资源(和 interrupt ,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用gpio,gpio使用0-MAX_INT之间的整数 ...
- TransactionScope事务处理方法介绍及.NET Core中的注意事项 SQL Server数据库漏洞评估了解一下 预热ASP.NET MVC 的VIEW [AUTOMAPPER]反射自动注册AUTOMAPPER PROFILE
TransactionScope事务处理方法介绍及.NET Core中的注意事项 作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.ht ...
- Linux进程概述
一.介绍 当linux系统中的一个进程运行起来的时候,总是要访问系统的资源,访问文件或者向其他的进程发送信号.系统是否允许其进行这些操作?系统是根据什么来判断该进程的权限?这些问题是和进程信任状(pr ...
- 取出分组后每组的第一条记录(不用group by)按时间排序
--操作日志表 CREATE TABLE [dbo].[JobLog]( [JobLogId] [int] IDENTITY(1,1) NOT NULL, [FunctionId] [nvarchar ...
- NRF24L01使用外部中断读取数据的问题
NRF24L01读取数据不能使用中断的方式,原因如下: 首先NRF24L01中断触发时,IRQ引脚会一直保持低电平直到状态寄存器中的中断标志被重新清零. stm32的外部中断触发方式只有上升沿或者下降 ...