[问题] std::bind + lambda + move-only object

楼主: dreamboat66 (小嫩)   2016-11-30 23:21:12
如果在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)的问题, 我是不是就不能呼叫了?
以上麻烦各位提供一些意见 厘清观念
谢谢
作者: Caesar08 (Caesar)   2016-11-30 23:49:00
关于2、3,标准的确是定义bind内部呼叫func是当l value所以2、3不能通过编译是正确的
楼主: dreamboat66 (小嫩)   2016-11-30 23:57:00
但至少unique_ptr<int> uptr2应该可吧?
作者: Caesar08 (Caesar)   2016-11-30 23:59:00
unique_ptr是个move only的object阿...
楼主: dreamboat66 (小嫩)   2016-12-01 00:05:00
阿阿~~了解
作者: Caesar08 (Caesar)   2016-12-01 00:05:00
然后1有点复杂bind的return type,只有当所有的parameter type都为copyable的时候,return type才能被copy。但是std::function的constructor是用copy f的方式,所以不能通过编译。然后std::function的operator=会呼叫constructor。(前后关系写颠倒了)对了,所有的parameter type也包含f的型态
楼主: dreamboat66 (小嫩)   2016-12-01 23:52:00
了解了 谢谢~~原来return type还可以不被spec定义

Links booklink

Contact Us: admin [ a t ] ucptt.com