Re: CString help
On Wed, 27 Jun 2007 23:05:01 -0700, "Mihai N." <nmihai_year_2000@yahoo.com>
wrote:
Ah, this clears things!
So, is this bug also adressed for the next version?
I hope so. It's had WP status since 2000, apparently:
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#259
Because otherwise the &s[0] tehnique will be just a bit safer
(because of the buffer continuity), but still not 100% compliant.
It's hard for me to care much about 100% conformance to an impossible
requirement. :) The bottom line is that s[0] on a non-const string is a
real reference, and it's writable; that much is not in question. This means
it's legal to do this:
char& r = s[0];
// ... Just don't invalidate r
r = 'x';
Moreover, the following is legal:
char& r0 = s[0];
char& r1 = s[1];
char& r2 = s[2];
// ... Note that saying s[1] didn't invalidate r0 or any other extant
// reference, iterator, or pointer on s that could have been created
// between the s[0] and s[1] expressions.
r0 = 'x';
r1 = 'y;
r2 = 'z;
Because these are real references, the following is fine:
char* p0 = &r0; // Or &s[0]
char* p1 = &r1;
char* p2 = &r2;
*p0 = 'x';
*p1 = 'y;
*p2 = 'z;
Contiguity means that &s[0], &s[1], ... point to successive elements of an
array. This plus the forgoing means it's OK to do this for a contiguous
string:
char* p0 = &s[0]
char* p1 = p0+1;
char* p2 = p0+2;
*p0 = 'x';
*p1 = 'y;
*p2 = 'z;
Therefore, for a contiguous string, the &s[0] method is fine, irrespective
of the buggy operator[] definition in terms of data().
--
Doug Harrison
Visual C++ MVP