This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: semantics of attribute const on constructors
Hi,
I don't generally disagree, that GCC does the correct thing here. I'm
completely satisfied if you don't change GCC.
I'm saying that the way I thought about const + ctor seems logical (if you are
not a compiler developer at least :-) ). Regardless of how well defined
"return value" is in the standards, to me as C++ developer the ctor acts as a
function that takes some input and leaves as output a constructed object.
Therefore, please be so nice to non-compiler developers and add a few words
about ctors (possibly about C++ member functions in general, since they all
have an implicit pointer argument) to the const attribute docs.
How about this patch to the docs?
- Note that a function that has pointer arguments and examines the data
pointed to must not be declared const.
+ Note that a function that has pointer arguments and examines the data
pointed to must not be declared const. This includes all C++ member functions,
including constructors, which have an implicit this-pointer argument.
On Friday 25 February 2011 17:42:40 Dave Korn wrote:
> On 25/02/2011 15:43, Matthias Kretz wrote:
> > I fully understand why it happened. So I imply your answer is that ctors
> > do not have a return value and my expectation, as explained above, is
> > wrong.
>
> You'd already know if ctors had return values, because you'd have had to
> be writing return statements in them all along if they did. For chapter
> and verse, c++ spec (iso/iec 14882) 12.1.10:
>
> > No return type (not even void) shall be specified for a constructor. A
> > return statement in the body of a constructor shall not specify a return
> > value. [ ... ]
>
> No return values there. (You may have been thinking of overloaded
> operators, that often end with a "return *this" statement.)
>
> > The website says:
> > "Many functions do not examine any values except their arguments, and
> > have no effects except the return value. Basically this is just slightly
> > more strict class than the pure attribute below, since function is not
> > allowed to read global memory.
> > Note that a function that has pointer arguments and examines the data
> > pointed to must not be declared const. Likewise, a function that calls a
> > non-const function usually must not be const. It does not make sense for
> > a const function to return void."
> >
> > All of these statements hold for my ctor in question:
> > 1. only examines its arguments
> > 2. no effects other than writing to its class members
>
> So, there you go. The this object in a constructor is not the "return
> value", so writing the members counts as "effects except the return value".
> Basically, making your ctor const told the compiler that it would not write
> to any of the class object's members!
>
> cheers,
> DaveK
Regards,
Matthias
--
Dipl.-Phys. Matthias Kretz
http://compeng.uni-frankfurt.de/index.php?id=mkretz