On Wednesday, 10 February 2016 at 20:42:29 UTC, w0rp wrote:
Back on the original topic, Scott Meyers often says "std::move doesn't move." It's more like std::rvalue_cast. C++ uses r-value references in order to be able to rip the guts out of objects and put them into other objects.

Well. In C++ "std::move(x)" is just a "static_cast<T&&>(x)" for "T x".

"T&&" references are different from "T&" by acting like T& references when used, but not on overloads. They are primarily for distinguishing between overloads on temporaries in function calls, T&& binds to temporaries. So you use "std::move(x)" to tell the type system that you want it to be cast as a references to a temporary like reference (or rvalue reference).

So that's why constructors with "T&&" are called move constructors (taking stuff from temporaries) and "const T&" are called copy constructors (assuming that the parameter might have a long life on it's own).

That kind of return value optimisation was the original motivation for r-value references, for when C++98 RVO isn't good enough, from my understanding.

It is for overloading. Why allocate lots of stuff by copying it if you know that the referenced object is about to die anyway? If it is dying we just steal the stuff it is holding.

stack.push(string("hiii")) // we could steal this stuff
string x("hiii")
stack.push(x) // we have to copy this stuff

Maybe someone else will correct me on a point or two there, but that's the understanding of move semantics in D that I have had.

I don't think D has move semantics... It does copying and clearing... The postblit thing looks like a dirty hack to me.

Reply via email to