How to const-overload opEquals(R)(R rhs)?

Jonathan M Davis jmdavisProg at gmx.com
Tue Aug 7 10:49:35 PDT 2012


On Tuesday, August 07, 2012 15:40:18 Tobias Pankrath wrote:
> Hey,
> 
> let's say I have a simple struct and I want to give it an
> opEquals like this.
> 
> struct Point
> {
> int x, y;
> bool opEquals(R)(R rhs) { return x == rhs.x && y == rhs.y; }
> }
> 
> 
> With this I can't call opEquals on const instances of Point,
> because dmd says
> 
> > bug.d(13): Error: function bug.Point.opEquals!(Point).opEquals
> > (Point rhs) is not callable using argument types (Point) const
> 
> So I overoad is with a const version of oqEquals:
> 
> struct Point
> {
> int x, y;
> bool opEquals(R)(R rhs) { return x == rhs.x && y == rhs.y; }
> bool opEquals(R)(R rhs) const { return x == rhs.x && y ==
> rhs.y; }
> }
> 
> But the error stays the same. So why is the const version not
> taken into consideration?
> 
> Thanks for your answers.

The standard way to define opEquals at this point would be to have

bool opEquals(const Point rhs) {return this == rhs;}
bool opEquals(const ref Point rhs) {...}

I don't know if templatizing it causes problems or not. And if you can't have 
it work with const for some reason, then remove the const modifiers on both.

But assuming that templatizing it works, since it's a template, you could
probably just do one definition with auto ref:

bool opEquals(R)(auto const ref rhs) const {...}

There have been some discussions on adjusting how const ref and/or auto ref 
works which would make it so that only one signature was required even without 
templates, but that hasn't been sorted out yet.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list