incubator-stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Travis Vitek" <Travis.Vi...@roguewave.com>
Subject RE: string cow bug ([Fwd: Fwd: Update: string COW])
Date Mon, 28 Jul 2008 21:18:41 GMT
 

Martin Sebor wrote:
>
>Farid Zaripov wrote:
>
>> Martin Sebor wrote:
>>>
>>> ...attached is a test case I got from a fellow attendee of my 
>>> meeting for what at first blush looks like a COW bug in 
>>> stdcxx string. The expected output on line 4 is:
>>>
>>> 2. cc1: 'H'
>>>
>> 
>> 21.3.1 p4:
>> -----------------------------
>> 4 References, pointers, and iterators referring to the elements of a
>> basic_string sequence may be invalidated by the following uses of
>> that basic_string object:
>> - As an argument to non-member functions swap() (21.3.8.8), 
>>   operator>>() (21.3.8.9), and getline() (21.3.8.9).
>> - As an argument to basic_string::swap().
>> - Calling data() and c_str() member functions.
>> - Calling non-const member functions, except operator[], at,
>>   begin, rbegin, end, and rend.
>> - Following construction or any of the above uses, except 
>>   the forms of insert and erase that return iterators, the
>>   first call to non-const member functions operator[], at, 
>>   begin, rbegin, end, or rend.
>> -----------------------------
>> 
>>   The first call on non-const operator[] for s1 object 
>> located in "s1[0] = 'H';" line. So after that line any
>> references to the elements are invalidated and cc1
>> should not be used after that line.
>
>But the spec says:
>
>   "...non-const member functions, *except* operator[]..."
>
>So the non-const overload of string::operator[]() is not
>allowed to invalidate references.
>

I think the last bullet is the most important one. It seems to allow for
the first call to op[] to invalidate iterators (and pointers and
references).

Travis

>Martin
>

Mime
View raw message