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/m.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燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP