Topic: Constructor can subvert constness
Author: Reid Ellis <rae@utcs.toronto.edu>
Date: Mon, 1 Apr 91 06:04:31 GMT Raw View
Tom Ngo <ngo@tammy.harvard.edu> writes:
>Interesting! This must be a violation of ARM 8.4.3 [References],
>which states:
>
> A reference to a plain T can be initialized only with a plain T.
>
>Assuming this rule is intended to apply to the initialization of a
>reference in a constructor, it seems you have uncovered an issue that
>really ought to be addressed in the ARM: what is that status of a
>constructor with regard to constness? Should it be made possible, as
>suggested by Jim Adcock <jimad@microsoft.UUCP>, for constructors to be
>specified as const? If so, how would a const constructor be permitted
>to change data members?
I think rather than enforcing const-ness at constructor time [after
all, a reference to "this" is a completely valid use of a reference,
especially if the reference is a reference to a base type] it might
have to be done at method time. However, only the link phase has all
the information necessary to resolve the reference [a special flag for
"reference to *this!" or something] and then notice the reference
being used in a non-const way inside a const method. Note that
special attention would have to be paid to the afore-mentioned
constructors that use references to base classes. e.g.:
struct base { int i; };
struct derived : base
{ derived();
base &b;
};
derived::derived() : b(*this) {}
Since 'b' is a reference to a base, its address may not == this,
especially of derived were multiply inherited. Thus, the linker
cannot simply check the address of the reference for equality with
"this". Perhaps it might check to see if it is a reference to
something "inside the current object" which would include not only
"this", but any fancy stuff like references to "int"s inside the
class.
Reid
--
Reid Ellis 1 Trefan Street Apt. E, Toronto ON, M5A 3A9
rae@utcs.toronto.edu || rae%alias@csri.toronto.edu
CDA0610@applelink.apple.com || +1 416 362 9181 [work]