Home > Mobile >  Is it portable to self move a std::string?
Is it portable to self move a std::string?

Time:10-01

std::string s = "y";
s = "x"   std::move(s)   "x";
Send(std::move(s));

Microsoft STL implementation checks for this, but is it mandated by the standard?

It looks more clean than insert append or two variables approach.

Note: I know I can do Send(std::move("x" std::move(s) "x")), but real code is not so simple.

CodePudding user response:

There's no self-move here. A self-move is something like this:

s = std::move(s);

which means

s.operator=(std::move(s));

In other words, when operator= is called, this points to the same string as the argument.

In your code, "x" std::move(s) will be evaluated first, which returns a std::string prvalue. In other words, not a reference to s, although it's possible that the concatenation might "steal" the buffer from s. Then the second is evaluated, and another prvalue is returned. Finally, operator= is called. At this point, the prvalue on the right-hand side has to be materialized, because it's bound to the rvalue reference argument of operator=. So all we have is s being assigned from a temporary object, which might have stolen s's buffer. But no matter: s is an object of a standard library type, which means that it is in a "valid but unspecified state". Since s is in a valid state, and is not the same object as the RHS, there is no problem.

  • Related