Comment #0 by bearophile_hugs — 2013-06-07T14:42:07Z
class Foo {
int x;
this(int x) {
this.x = x;
}
bool opEquals(in Foo a) const {
return a.x == this.x;
}
}
void main() {
Foo f1 = new Foo(10);
Foo f2 = new Foo(10);
assert(f1 != f2);
assert(f1.opEquals(f2));
}
/*
This code compiles with no errors nor warnings with dmd 2.064alpha.
Expected something like:
test(6): Warning. Class opEquals should have signature like: override bool opEquals(Object) const
Here a little more correct opEquals is:
override bool opEquals(Object a) const {
auto fooa = cast(Foo)a;
if (fooa is null)
return false;
return fooa.x == this.x;
}
The compiler needs to give warnings or errors for such cases of wrong signatures. If you don't write opEquals(Object) it needs to complain. I think the current situation of silent accepting wrong/useless special methods is not acceptable in modern language.
(Code adapted from a post by "Namespace" in D.learn).
Comment #1 by robert.schadek — 2024-12-13T18:07:50Z