作者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/cn.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