看板 C_and_CPP 關於我們 聯絡資訊
如果在C++ 11 lambda想要move capture 似乎只能用一些手腳 於是我就好奇的做了一些測試 http://ideone.com/99S4Qx 大概分成三個問題(如code所列) 1. 這個最單純, 一般認知std bind回傳的物件可以用 std::function來接 但我這樣寫 怎麼樣都接不起來 似乎只能用auto讓他自己判斷, 為什麼呢? 2. 用了auto來寫 接了以後想要invoke看看, 誰知道遇到怪事 (a) lambda參數寫 const unique_ptr<int>& uptr2 後 就可以呼叫func2(這勉強可以接受) (b) 參數寫 unique_ptr<int>& uptr2 竟然可以吃 std::move的rvalue ref (這感覺內部實做還是by lvalue傳遞, 但又沒有std::rref 整個有點怪) (c) 寫 unique_ptr<int>&& uptr2 或是 unique_ptr<int> uptr2 只要寫了func2() 就會 compile error...這我就不知道為什麼了 3. 也就是上面(c)的問題, 我是不是就不能呼叫了? 以上麻煩各位提供一些意見 釐清觀念 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.218.202.250 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1480519276.A.FD3.html
Caesar08: 關於2、3,標準的確是定義bind內部呼叫func是當l value 11/30 23:49
Caesar08: 所以2、3不能通過編譯是正確的 11/30 23:50
dreamboat66: 但至少unique_ptr<int> uptr2應該可吧? 11/30 23:57
Caesar08: unique_ptr是個move only的object阿... 11/30 23:59
dreamboat66: 阿阿~~了解 12/01 00:05
Caesar08: 然後1有點複雜 12/01 00:05
Caesar08: bind的return type,只有當所有的parameter type都為 12/01 00:06
Caesar08: copyable的時候,return type才能被copy。但是 12/01 00:07
Caesar08: std::function的constructor是用copy f的方式,所以不能 12/01 00:08
Caesar08: 通過編譯。然後std::function的operator=會呼叫 12/01 00:08
Caesar08: constructor。(前後關係寫顛倒了) 12/01 00:09
Caesar08: 對了,所有的parameter type也包含f的型態 12/01 00:12
dreamboat66: 了解了 謝謝~~原來return type還可以不被spec定義 12/01 23:52