作者dreamboat66 (小嫩)
看板C_and_CPP
標題[問題] std::bind + lambda + move-only object
時間Wed Nov 30 23:21:12 2016
如果在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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1480519276.A.FD3.html
1F:→ Caesar08: 關於2、3,標準的確是定義bind內部呼叫func是當l value 11/30 23:49
2F:→ Caesar08: 所以2、3不能通過編譯是正確的 11/30 23:50
3F:→ dreamboat66: 但至少unique_ptr<int> uptr2應該可吧? 11/30 23:57
4F:→ Caesar08: unique_ptr是個move only的object阿... 11/30 23:59
5F:→ dreamboat66: 阿阿~~了解 12/01 00:05
6F:→ Caesar08: 然後1有點複雜 12/01 00:05
7F:→ Caesar08: bind的return type,只有當所有的parameter type都為 12/01 00:06
8F:→ Caesar08: copyable的時候,return type才能被copy。但是 12/01 00:07
9F:→ Caesar08: std::function的constructor是用copy f的方式,所以不能 12/01 00:08
10F:→ Caesar08: 通過編譯。然後std::function的operator=會呼叫 12/01 00:08
11F:→ Caesar08: constructor。(前後關係寫顛倒了) 12/01 00:09
12F:→ Caesar08: 對了,所有的parameter type也包含f的型態 12/01 00:12
13F:→ dreamboat66: 了解了 謝謝~~原來return type還可以不被spec定義 12/01 23:52