| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4737 人关注过本帖
标题:Lambda表达式
只看楼主 加入收藏
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
结帖率:93.75%
收藏
已结贴  问题点数:20 回复次数:6 
Lambda表达式
跟着一个博客学习QT,提到了这个Lambda表达式,想搞清楚。
百度百科了一下,有点明白,又有点不明白
[capture list] (parameter list) ->return type { function body }
【捕获列表】(函数所需参数列表){函数主体}
图片附件: 游客没有浏览图片的权限,请 登录注册
这部分我感觉我可以理解了
但是那个捕获列表干嘛用的就搞不懂了。(难道是检测捕获列表里的所有变量,一旦全部被使用就跳转过来执行Lambda表达式?我看C#里面的=》就叫做goes to 所以猜想是不是和go to有联系)
然后后面这一部分就真的变成天书,看不懂。。。
图片附件: 游客没有浏览图片的权限,请 登录注册

1.第一行的捕获列表x在那个时刻不是还没定义吗?怎么就用了?还是说他是形参,不对,也没有声明类型啊?
2.第三行的捕获列表怎么只有一个&,神马意思?
3.第三行的函数定义的形参明明是X,函数内部修改的却是y,Lambda表达式不是一个独立的函数吗?他怎么能用main()的变量?如果他和Main共享变量名域,那么为什么又声明了一个x,是不是这个x算局部变量,覆盖了更高的x,这么做的意义何在?
5.第三行注释说要注意y的生存期,难道里面的Y还是和外面的不一个?执行完第3行以后全局y还是1?
4.第四行的代码是不是等价于#define fp(a,b) ((a)>(b))   ?具体说就是声明了一个函数指针fp,指向一个需要两个int参数的函数。那么Lambda表达式的返回值就是它自身所在地址,而return a>b就是Lambda里面那个函数的返回值。
6.我复制这段代码进IDE ,编译报错一大堆。总的来说比如第一行的第一个x未定义,第二个x未捕获,然后每行最后面都多了一个右括号
E:\pta 数据结构与算法\test.cpp    In function 'int main()':
12    11    E:\pta 数据结构与算法\test.cpp    [Error] 'x' was not declared in this scope
E:\pta 数据结构与算法\test.cpp    In lambda function:
12    36    E:\pta 数据结构与算法\test.cpp    [Error] 'x' is not captured
E:\pta 数据结构与算法\test.cpp    In function 'int main()':
12    38    E:\pta 数据结构与算法\test.cpp    [Warning] lambda expressions only available with -std=c++11 or -std=gnu++11
12    38    E:\pta 数据结构与算法\test.cpp    [Error] invalid user-defined conversion from 'main()::<lambda(int, int)>' to 'int' [-fpermissive]
12    25    E:\pta 数据结构与算法\test.cpp    [Note] candidate is: main()::<lambda(int, int)>::operator void (*)(int, int)() const <near match>
12    25    E:\pta 数据结构与算法\test.cpp    [Note] no known conversion from 'void (*)(int, int)' to 'int'
12    39    E:\pta 数据结构与算法\test.cpp    [Error] expected ',' or ';' before ')' token
15    10    E:\pta 数据结构与算法\test.cpp    [Error] 'g' does not name a type
15    35    E:\pta 数据结构与算法\test.cpp    [Error] expected primary-expression before ')' token
16    51    E:\pta 数据结构与算法\test.cpp    [Warning] lambda expressions only available with -std=c++11 or -std=gnu++11
16    52    E:\pta 数据结构与算法\test.cpp    [Error] expected ',' or ';' before ')' token






[此贴子已经被作者于2016-9-8 15:15编辑过]

搜索更多相关主题的帖子: 百度百科 检测 博客 表达式 
2016-09-08 14:55
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9032
专家分:54061
注 册:2011-1-18
收藏
得分:10 
1.第一行的捕获列表x在那个时刻不是还没定义吗?怎么就用了?还是说他是形参,不对,也没有声明类型啊?
你试试看就知道了呀,仅仅这样是编译不通过的

2.第三行的捕获列表怎么只有一个&,神马意思?
将内部用到的所有外部变量以引用方式捕获
甚至还可以
    int a=0,b=0,c=0;
    auto f = [&,b,x=c](){};
即除非另行声明,缺省引用捕获

3.第三行的函数定义的形参明明是X,函数内部修改的却是y,Lambda表达式不是一个独立的函数吗?他怎么能用main()的变量?如果他和Main共享变量名域,那么为什么又声明了一个x,是不是这个x算局部变量,覆盖了更高的x,这么做的意义何在?
问得有点儿乱,“第三行的函数定义的形参明明是X,函数内部修改的却是y”---只是个演示代码而已;
“Lambda表达式不是一个独立的函数吗?他怎么能用main()的变量?”---你可以将它看成是一个类(也确实是一个类),其内部定义了一些变量,这些变量有些是外部变量的值拷贝,有些是外部变量的引用。
“如果他和Main共享变量名域,那么为什么又声明了一个x,是不是这个x算局部变量,覆盖了更高的x,这么做的意义何在?” --- x是函数的参数,别混在一起。

5.第三行注释说要注意y的生存期,难道里面的Y还是和外面的不一个?执行完第3行以后全局y还是1?
“第三行注释说要注意y的生存期,难道里面的Y还是和外面的不一个?”---难道不正是因为是同一个才需要注意y的生存期吗?!
“执行完第3行” --- 这句话有歧义,执行完第三行y当然不变,因为这个lambda没有被调用呀,你得写一句 g(123) 它才是函数调用,此后y就改变了。

4.第四行的代码是不是等价于#define fp(a,b) ((a)>(b))   ?具体说就是声明了一个函数指针fp,指向一个需要两个int参数的函数。那么Lambda表达式的返回值就是它自身所在地址,而return a>b就是Lambda里面那个函数的返回值。
听不懂

6.我复制这段代码进IDE ,编译报错一大堆。总的来说比如第一行的第一个x未定义,第二个x未捕获,然后每行最后面都多了一个右括号
第一句是不完整的,“多了一个右括号”一眼就能看出来
2016-09-09 08:31
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 2楼 rjsp
谢谢您的帮助!

我想写代码测试自己的想法,验证Lambda的用法。。。遇到麻烦了...

图片附件: 游客没有浏览图片的权限,请 登录注册

上网搜了一下,auto是C11的标准。我用的是DEVC++5.11.我用的标准是什么能不能查看?怎么改?

参数里加上 -std=c++11再试试
我应该加在哪里?感觉他们是用命令行编译的时候这样加的参数。我应该怎么办,



φ(゜▽゜*)♪
2016-09-09 11:07
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9032
专家分:54061
注 册:2011-1-18
收藏
得分:10 
程序代码:
#include <iostream>

int main( void )
{
    int key = 5;
    auto g = [key](int a){ return a>key; };
    std::cout << std::boolalpha << g(4) << std::endl;
    std::cout << std::boolalpha << g(6) << std::endl;
}
输出 false true

要想看gcc的版本,可以进入mingw的bin目录,执行 gcc --version
例如我的显示 gcc (i686-posix-dwarf, Built by MinGW-W64 project) 6.1.0

-std=c++11 加在编译参数中,devcpp我不知道在哪里加,你在工程属性上、菜单中找找看。
另外,C++11 之后还有 C++14 及 C++17,你不如直接加参数 -std=c++17
如果你的编译器太旧,可以下载一个新的
mingw的下载地址:https://
mingw-w64的下载地址:https://
2016-09-09 12:04
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 4楼 rjsp
谢谢,已查询到
图片附件: 游客没有浏览图片的权限,请 登录注册


谢谢您给出的链接,接下来的我去找百度
谢谢


φ(゜▽゜*)♪
2016-09-09 12:28
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 4楼 rjsp
图片附件: 游客没有浏览图片的权限,请 登录注册

14    28    E:\pta 数据结构与算法\test.cpp    [Error] decrement of read-only variable 'Key'
我不是已经是引用传递了吗?为什么说Key是只读函数。




[此贴子已经被作者于2016-9-9 15:03编辑过]


φ(゜▽゜*)♪
2016-09-09 14:51
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 6楼 书生牛犊
已解决
【&】(){...}  表示把当前模块中的所有变量引用传递进表达式内部
[=](){...}    表示把当前模块中的所有变量值传递到表达式内部
【参数表】(){}  和[=]类似,但是只选择了需要的部分变量值传递到表达式内部
[](){...}    表示表达式内部不需要任何额外的参数。

φ(゜▽゜*)♪
2016-09-09 15:07
快速回复:Lambda表达式
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023982 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved