Re: const qualifers and references
PHeadland@excite.com wrote:
Consider the following:
int* p = NULL;
int*& r1 = p;
const int*& r2 = p;
const int* const& r3 = p;
MS VS 2003 compiles this just fine, as do various proprietary UNIX
compilers.
That surprises me somewhat, as the third line is definitly
illegal, and has been since at least 1989. If you replace the
references by pointers, you get:
int* p = NULL;
int** r1 = &p;
const int** r2 = &p;
const int* const* r3 = &p;
The third line isn't legal C, and the rules concerning reference
conversions have always been based on the rules for pointer
conversions.
The fourth line is also illegal C, but the C++ committee
realized that C was being too restrictive here, and explicitly
allowed it. (It's possible that C99 followed C++'s lead in this
regard; I don't currently have access to any of the standards to
verify.)
I have been told that g++ 4.0.1 (which I don't have installed
here) complains about the declaration of r2, but is happy with
the other two references. Is g++ right to complain?
And how. Allowing this would create an enormous hole in the
type system, and allow removing const without a cast.
If it is right, why, and why does it accept the declaration of
r3?
Because the C++ committee allowed it. In fact, the conversion
in question cannot be used to violate const, so it is safe.
--
James
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]