C_and_CPP 板


LINE

你应该有一个概念没有搞懂: C++ 的 lambda 其实是个 functor 在你写 lambda 的当下有一个 class 在此成立, 并产生一个实体 lambda 函式内容则是此 class 的 operator () 内容 这个 operator () 预设是有常数性, 也就是在函式中这 lambda class 是当做常数 (其实跟平常 class 宣告里在 member function 宣告後面加上 const 的意思一模一样 之所以这麽设定的理由可见这连结 http://stackoverflow.com/questions/5501959/ ) 所有被 capture by value 的变数都是这个 class 的成员变数 在 lambda 产生的当下产生实体时会复制进去 ※ 引述《dreamboat66 (小嫩)》之铭言: : 写程式遇到一个compile error原本看不出来原因 : 简化一下问题如下 : http://ideone.com/9Vqbvu : 如果真的遇到这种case : 我要很大方的冠上mutable吗? : 还是想办法里面const cast拿掉const让move成功 所以在这里, 里面的 f2 和外面的 f2 是不同的变数 @@@+ 和 @@@- 之间的那次复制就是复制出里面的 f2 的那次 因此两个 f2 既然没关系, 使用 move 也就没有意义了 move 没有用的原因确实是常数性没错 但这是因为这个 operator () 的常数性, 使得其成员物件全部都是 const 这里如果你要把外面的 f2 给 move 进来的话 可以使用下面的 C++14 的带初始化 capture, 写 [f2 = move(f2)](...){...} 这样在建构时就会把外面的 f2 给 move 进去 : 如果惯上mutable的话 : http://ideone.com/s5KtOq : 又遇到奇怪问题 : 为什麽他要保留const 这属性, 如果alias他名字(这好像c++14才能这样写?)就不会... : 这有什麽特殊含意吗? 因为用template 推型别的观念 const是不会保留的呀 : 以上 : 谢谢 所以这里也不是 alias 而是这个 lambda class 里的两个成员变数 f2 和 f3, 都由外面的 f2 复制而来 这个 f3(f2) 是当做有个 auto f3(f2); 卡在这 lambda 宣告之前 但不在外面的 scope 里 所以後一个指向 f3(f2) 的 error 就是因为这个 f2 是外面的 f2, 那是 const 但你却宣告了 (lvalue-)copy ctor 为 explicit 不过这个先不管, 你的问题是在 Bar(f3) 和 Bar(f2) 的差别 f3 跟 f2 的差别在於 f2 继承自它抓取的变数的常数性, 但 f3 却是一个全新的变数 下面这个连结应该回答了你这部份的问题 http://stackoverflow.com/questions/31485041/ 解法里面也提到了, 既然你有 C++14 的带初始化 capture 写 [f2 = f2] 就好, 这样如上所言这里就会用上 auto 的规则, 常数性就不见了 或是你还想要把外面的 f2 给 move 进来那就一样 [f2 = move(f2)] -- 'You've sort of made up for it tonight,' said Harry. 'Getting the sword. Finishing the Horcrux. Saving my life.' 'That makes me sound a lot cooler then I was,' Ron mumbled. 'Stuff like that always sounds cooler then it really was,' said Harry. 'I've been trying to tell you that for years.' -- Harry Potter and the Deathly Hollows, P.308 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.177.29.238
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1477781583.A.49C.html ※ 编辑: LPH66 (180.177.29.238), 10/30/2016 06:53:52 ※ 编辑: LPH66 (180.177.29.238), 10/30/2016 06:54:54
1F:推 dreamboat66: 谢谢解答, 因为我的平台不能用c++14 所以才想问这些 10/30 10:39
2F:→ dreamboat66: "f2 继承自它抓取的变数的常数性" 这是规则吗? 10/30 10:42
3F:→ dreamboat66: 回个问 整理一下问题 谢谢 10/30 10:56







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP