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 >
