How will we fix opEquals?
Jonathan M Davis
jmdavisProg at gmx.com
Thu Feb 10 12:40:56 PST 2011
On Thursday 10 February 2011 12:22:48 Don wrote:
> Steven Schveighoffer wrote:
> > On Thu, 10 Feb 2011 10:19:50 -0500, Andrei Alexandrescu
> >
> > <SeeWebsiteForEmail at erdani.org> wrote:
> >> On 2/10/11 2:58 AM, Peter Alexander wrote:
> >>> On 10/02/11 8:19 AM, Don wrote:
> >>>> Andrei once stated a worthy goal: as far as possible, const should be
> >>>> opt-in: it should be possible to code without requiring const on
> >>>> everything.
> >>>>
> >>>> opEquals() is in conflict with this, since it is a member function of
> >>>> Object.
> >>>>
> >>>> (1) If it is a const member function, then it will have a viral effect
> >>>> on all objects -- any function called by opEquals will have to be
> >>>> marked
> >>>> const.
> >>>> (2) If it is not const, then const objects cannot be compared!
> >>>>
> >>>> Currently, it's not const, but the problem isn't visible because of
> >>>> compiler bug 5080. (Same problem applies to opCmp).
> >>>>
> >>>> How will we break this dilemma?
> >>>
> >>> It's not possible.
> >>
> >> It is, in fact, possible. We can define two opEquals overloads, for
> >> const and non-const. By default, the non-const version forwards to the
> >> const one.
> >
> > This doesn't work. If you only define one, then you will have problems
> > with hidden function errors, and/or inconsistencies. For example, how
> > does .opEquals(Object obj1, Object obj2) know which version to call?
> >
> > I think the only true solution is to make it const and call it a day.
> >
> > -Steve
>
> I fear that you're probably right. The const opEquals must exist,
> otherwise the object will be unable to use most functions in Phobos.
> And I don't see how it can safely be synthesised from non-const opEquals.
>
> A tiny compromise which could be made, is to silently add 'const' to any
> class opEquals declaration, even if not present in the source. That way,
> simple use cases would still compile without complaint.
> (As long as only a single, precisely defined opEquals signature is
> permitted, I think any other signature should be flagged as an error --
> but it could be converted to the correct signature, instead).
>
> Dunno if this would be worth it, though.
I'd argue that silently changing function signatures is a _bad_ idea. And when
they actually try and do something which would violate the constness of the
function, they're going to be left scratching their head as to why a non-const
function is getting complaints about const. In general, D has opted to _not_ do
things silently. C++ did a fair bit of it in certain places (albeit not with
const), and it's caused problems. I don't think that this would be as big a
problem, but I still don't think that it's a good idea.
Really, while it's reasonable to not force D programmers to use const all over
the place, I do _not_ think that it's reasonable for a D programmer to not be
aware of const. And since opEquals, opCmp, toHash, and toString/writeTo all need
to be const, the programmer is just going to have to deal with that fact. And
having to put const on a few functions is likely to cause less pain than figuring
out why they're getting errors with regards to const when they never use const
anywhere.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list