A problem that I always run into with code using * for multiplication of matrices is which operation they use. Is it element wise or a matrix multiplication?
Or you can assume it's implemented sanely. Yes if someone overrides $ and does something wildly wrong with it that'll get confusing. That's the fault of whoever wrote that code though, not of $ itself.
You can also overload +, imagine the mayhem if someone did something weird with that. should we ban overloading operators altogether?
excuse me, have you spent any time in tech? people fucking love to do clever shit that gets people in trouble. using NULL as a not-pointer value signalling absence (without safeguards) is probably the most notorious -- but at least useful, but if you want to get brain meltingly annoying and pervasive, we dont have to stray too far from the idea of operator overloading; c++'s << operator can just go to hell.
I work in tech full time. I mostly write python code. Python similar to D allows you to override ~all operators.
I have yet to run into an instance where someone has overridden operators to do something completely insane. Honestly the weirdest real use-case I've ran into is pathlib overriding division on path objects to instead mean concatenation. Which seems confusing until you realize it just means paths get written like `build_dir = root_dir / "build"` which is sensible enough.
Weirdest not-real use case is of course the famous goto-in-python module which overrides attribute access in combination with unhinged dark magic to implement goto.
> Structs and classes can even overload this operator
nope. fuck, now it's a terrible idea