On Wednesday, 3 February 2016 at 15:56:48 UTC, Ola Fosheim
Grøstad wrote:
On Wednesday, 3 February 2016 at 15:44:25 UTC, Sönke Ludwig
wrote:
seems like pretty clear semantics. And in C++ you'd have the
same situation once somefunction decides to move/swap the
value somewhere else before throwing an exception.
Well, you can always move it back or wait with the move.
Also, std.move may end up being inefficient when you have a
complicated resource holder. Since the work is done before
calling the function the optimizer may struggle with getting
rid of the work.
In my experience, in the vast majority of cases a C++ move
operation boils down to a memberwise copy (of value types) or
copy-and-reset (of reference types). With the extra logic and
program flow that is sometimes involved in move construction and
move assignment, I suspect that a straightforward double memcpy
as it is done in D will be almost as performant or moreso most of
the time.
Add to that the fact that a lot of programmers out there will
implement move construction in terms of move assignment -- which
makes it a default construction PLUS move -- and move assignment
in terms of swap -- i.e., three moves -- for the sake of DRY.
Personally, I think D's move semantics are actually clearer and
easier to get right.
It is somewhat unfortunate that you cannot provide the strong
exception guarantee for a function when you move arguments into
it, though, but the semantics are pretty clear and easy to
explain to newbies: If you use std.move() on something it
definitely gets moved. In C++, if you use std::move() on
something it may or may not be moved; it depends on the recipient
of the move.
Lars