RFC: Allow moved-from strings to be non-empty

Jonathan Wakely jwakely@redhat.com
Fri Dec 21 20:42:00 GMT 2018


On 30/10/18 07:48 +0100, François Dumont wrote:
>On 10/27/18 12:33 AM, Ville Voutilainen wrote:
>>On Sat, 27 Oct 2018 at 01:27, Joe Buck <joe.buck@synopsys.com> wrote:
>>>The reason move constructors were introduced was to speed up code in cases where an object
>>>Is copied and the copy is no longer needed.  It is unfortunate that there may now be code out
>>>there that relies on accidental properties of library implementations.  It would be best if the
>>>Implementation is not constrained.  Unless the standard mandates that, after a string is moved,
>>>the string is empty, the user should only be able to assume that it is in some consistent but
>>>unspecified state.  Otherwise we pay a performance penalty forever.
>>>
>>>If the standard explicitly states that the argument to the move constructor is defined to be
>>>empty after the call, we're stuck.
>>It certainly doesn't specify so for an SSO string, so we're not stuck.
>>On the other hand, we already get
>>a speed-up, it's just not as much of a speed-up as it can be. What I
>>really loathe is the potential implementation
>>divergence; it's all good for the priesthood to refer to the standard
>>and say "you shouldn't have done that", but
>>that's, as a good friend of mine provided as a phrasing on a different
>>manner, spectacularly unhelpful.
>>
>+1 to allow moved-from strings to be non-empty
>
>In many cases move will take place on temporary instances which future 
>is just to be destroyed.
>
>It's already too bad that in such situation we sometimes do some 
>allocation because current implementation do not support none 
>(std::deque)
>
>Note that on vector we already have this undefined behavior within 
>libstdc++ itself. On std::vector move constructor empty the moved 
>instance but allocator extended one with equal allocator instance 
>don't, it just swap content.

But the content of the new object being constructed is empty, because
it's a new object being constructed. It doesn't have any elements. So
if you swap the content, the moved instance becomes empty. Or have I
misunderstood what you're saying?

>I'll add to my TODO to detect this kind of invalid usage in Debug 
>pendantic mode.

I'm not sure we want to do that; code relying on it might be
non-portable, but it's not undefined.




More information about the Libstdc++ mailing list