
Dave Abrahams wrote:
on Tue Aug 23 2011, Julian Gonggrijp <j.gonggrijp-AT-gmail.com> wrote:
Ion GaztaƱaga wrote:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm
That's interesting, but after reading that page I think raw_move is not the same as destructive move. The difference: destructive move acts as a destructor and hence makes the source object unavailable for further use.
Well, technically, it makes the source object's storage usable as raw memory.
In move_raw on the other hand, the source object is left in an invalid but non-destructed state which it can only be rescued from by raw moving another value into it (if it is non-POD).
How is an "invalid but non-destructed state" practically different from raw memory? Are you saying I can't default-construct another value of the same type in that memory?
I must admit that you do a good job at making these moves look more similar. :-) And yes, to be fair I must say that you can probably default-construct a new object of the same type in a raw-moved-from object. But no, they are still not really the same. After a destructive move the source object is in a destructed state (raw memory, as you say), so in principle you should not need to worry about it anymore; i.e. it won't be destructed again at the end of scope. You're not really expected to store a new value of the moved-from type in the object; if you do want to do so you'll first have to run a constructor again. The source of a raw move on the other hand is a bomb waiting to explode, because technically speaking it is still storing a value of the moved-from type and it *will* be destructed at the end of scope. Hence you are forced to give it a new, valid value. It follows that they also have different use cases. A destructive move seems useful for returning local variables from functions. A raw move on the other hand can only be used if you are reordering values within the same scope. -Julian