On Wednesday, 19 March 2025 at 06:05:24 UTC, Manu wrote:
> On Wed, 19 Mar 2025 at 11:36, Meta via Digitalmars-d < Why didn't his operator overloading experiment work?
struct S {
int x;
}
// non-member opBinary
S opBinary(string s : "+")(S lh, S rh) {
return S(lh.x + rh.x);
}
void main()
{
S a, b;
S s1 = a.opBinary!"+"(b); // <- UFCS works, as expected
S s2 = a + b; // ERROR: doesn't work! why not? the rewrite should work
via UFCS as above...
}
I can't imagine any good reason his experiment should have failed. I would want this too when extern to a C lib; it hasn't come up for me before, but if it did, I would log a bug instantly.
operator overloads must be member functions.
I think this fits into Walter's vision that you should not be able to abuse operator overloads to build your own semantics with already-defined types.
e.g. you shouldn't be able to define a + b
to be something other than what a
or b
intended.
This already is allowed via UFCS, I guess Walter thinks operator overloads are more intimate for the types.
Take note that UFCS did not exist for D1 (except for arrays), so this vision was more consistent back then.
I don't know if this is one of those "will never happen" stances, or "maybe I can be convinced" stances.
-Steve