[问题] unique_ptr与move

楼主: james732 (好人超)   2016-08-10 23:25:24
问题(Question):
https://www.chromium.org/rvalue-references
在上面这个网页里,看到这段叙述
However, if the types of the variable and the return type do not match
exactly, then you will have to use std::move() in order to convert without
creating an extra temporary.
std::unique_ptr<MyType> MakeMyType()
{
std::unique_ptr<ChildClassOfMyType> ptr;
// This call to std::move() is needed to convert from a pointer-to-the
// child class to a pointer-to-the parent.
return std::move(ptr);
}
我看不懂的是…为什么这样写可以减少extra temporary呢?
如果不这么写的话又会造成什么问题?
(想知道这个写法的反例?)
作者: Caesar08 (Caesar)   2016-08-10 23:40:00
因为不这么做,不能通过compile?可是我在MSVC跟GCC上,又都能通过compile...对于要convert type的unique_ptr,unique_ptr的constructor只接受r value。所以应该是这原因导致要move可能是return value都会当作r value,然后能用RVO的就用所以就刚好可以通过编译了吧。以上是我的猜测,请求支援
作者: EdisonX (卡卡兽)   2016-08-11 00:54:00
#19gioP8j Page9~12 , 讲八个 string 相加的问题不推别人会以为看不懂啊! @@
作者: steve1012 (steve)   2016-08-11 03:47:00
你这样问好像有点误导 点进去才知道unique Ptt 是个例子简单来说 return 一个不match 像是要int 你return long有可能有copy 发生使用move 可以确保不会有copy 因为compiler 读到知道不能copy要是我想的没有错的话 这个应该是建议而非require这里提到这个的原因是因为简单的情况下compiler 可以自己采用move semantics 但复杂的情况 要cast的情况可能不会 move 提供一个hint 给compilerInt long 的例子不太好 可能要user defined type 比较好
作者: Caesar08 (Caesar)   2016-08-11 13:34:00
可是unique_ptr不能copy,long转int不能适用
作者: steve1012 (steve)   2016-08-11 14:21:00
早上没看推文xd 看来我误解了一楼都讲完了 会抠move constrictor
作者: bluesoul (忙死你老爸)   2016-08-12 20:11:00
你应该先搞懂move semantics
作者: druid0214 (Assassin)   2016-08-12 21:34:00
推荐看effective modern C++ 去理解C++11
作者: Caesar08 (Caesar)   2016-08-13 21:33:00
我发现这后面有很大的议题...

Links booklink

Contact Us: admin [ a t ] ucptt.com