Beginner problem: casting in opCmp override
H. S. Teoh
hsteoh at quickfur.ath.cx
Tue Jul 9 13:48:02 PDT 2013
On Mon, Jul 08, 2013 at 05:09:14PM -0700, Jonathan M Davis wrote:
> On Monday, July 08, 2013 16:58:03 H. S. Teoh wrote:
> > On Mon, Jul 08, 2013 at 04:48:05PM -0700, Jonathan M Davis wrote:
> > > On Monday, July 08, 2013 16:38:16 H. S. Teoh wrote:
> > [...]
> >
> > > > Basically, when you write x==y, the compiler looks for opEquals
> > > > and opCmp. If opEquals is found, then it's rewritten as
> > > > x.opEquals(y); otherwise, if opCmp is found, it's rewritten as
> > > > x.opCmp(y)==0. If neither are found, then the compiler generates
> > > > a default implementation of opEquals, which basically does a
> > > > bitwise comparison of x and y.
> > >
> > > Actually, what it's supposed to do isn't necessarily a bitwise
> > > comparison. It's supposed to do a recursive comparison of all of
> > > the members, where it calls == on each of the members. If a
> > > bitwise comparison will do that, then it may end up as a bitwise
> > > comparison for efficiency reasons, but it's not necessarily a
> > > bitwise comparison. It used to be that it was doing a bitwise
> > > comparison when it wasn't supposed to, but that was fixed fairly
> > > recently (though I don't recall if that fix has been released
> > > yet).
> > >
> > > Basically, there's no reason to overload opEquals unless you have
> > > a member which you don't want to compare with == (e.g. pointers).
> >
> > [...]
> >
> > Unfortunately, this isn't true for opCmp. If you don't define opCmp,
> > the typeinfo of the struct will have a compare function that
> > basically does bitwise comparison. Proof:
> >
> > struct S {
> > int[] data;
> > }
> > void main() {
> > auto s = S([1,2,3]);
> > auto t = S([1,2,3]);
> > auto u = S([1,2,4]);
> >
> > assert(s == t);
> > assert(s != u);
> > assert(typeid(s).compare(&s, &t) == 0); // FAILS
> > assert(typeid(s).compare(&s, &u) != 0);
> > }
> >
> > Should this be filed as a DMD bug?
>
> Yes. opCmp's behavior should definitely match opEquals' behavior.
[...]
http://d.puremagic.com/issues/show_bug.cgi?id=10588
T
--
MSDOS = MicroSoft's Denial Of Service
More information about the Digitalmars-d-learn
mailing list