[問題] std::bind + lambda + move-only object

看板C_and_CPP作者 (小嫩)時間9年前 (2016/11/30 23:21), 編輯推噓0(0013)
留言13則, 2人參與, 最新討論串1/1
如果在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

11/30 23:49, , 1F
關於2、3,標準的確是定義bind內部呼叫func是當l value
11/30 23:49, 1F

11/30 23:50, , 2F
所以2、3不能通過編譯是正確的
11/30 23:50, 2F

11/30 23:57, , 3F
但至少unique_ptr<int> uptr2應該可吧?
11/30 23:57, 3F

11/30 23:59, , 4F
unique_ptr是個move only的object阿...
11/30 23:59, 4F

12/01 00:05, , 5F
阿阿~~了解
12/01 00:05, 5F

12/01 00:05, , 6F
然後1有點複雜
12/01 00:05, 6F

12/01 00:06, , 7F
bind的return type,只有當所有的parameter type都為
12/01 00:06, 7F

12/01 00:07, , 8F
copyable的時候,return type才能被copy。但是
12/01 00:07, 8F

12/01 00:08, , 9F
std::function的constructor是用copy f的方式,所以不能
12/01 00:08, 9F

12/01 00:08, , 10F
通過編譯。然後std::function的operator=會呼叫
12/01 00:08, 10F

12/01 00:09, , 11F
constructor。(前後關係寫顛倒了)
12/01 00:09, 11F

12/01 00:12, , 12F
對了,所有的parameter type也包含f的型態
12/01 00:12, 12F

12/01 23:52, , 13F
了解了 謝謝~~原來return type還可以不被spec定義
12/01 23:52, 13F
文章代碼(AID): #1OFkvi_J (C_and_CPP)