Well, ifa ~= S();does result in a temporary which get copied and then destroyed, why have move semantics at all? Move semantics are not just an optimization, they actually change the semantics.
There was a similar discussion on struct constructors which ended up something like this, that it is an optimization.
I fully agree it is not, move exists just the reasons like this.
