Operator Overloading - Only for Classes and Structs?

Nick Treleaven nick at geany.org
Mon Jun 23 15:27:46 UTC 2025


On Sunday, 22 June 2025 at 15:04:27 UTC, matheus wrote:
> Hi, could someone please tell me why operador overloading 
> (https://dlang.org/spec/operatoroverloading.html) is relegated 
> only to classes and structs?

One reason is that it would be hard to reason about what the 
operator means - for example if there is one operator overload in 
module `a` and another one in `b`, that have compatible operand 
types, and both imports are used in the same project for 
different modules.

Restricting operator overloading to the type definition avoids 
this problem.

That in itself might not be too much of a problem, but then any 
expression may implicitly convert to a type that has an operator 
overload defined. It can get hard to see what is going on, and 
free function operator overloads would complicate this.

> "1 Operator overloading is accomplished by rewriting operators 
> whose operands are class or struct objects into calls to 
> specially named members. No additional syntax is used."
>
> I'd like to overload "~" to concatenate a string with a integer 
> and do something else,  like:
>
>   auto s = "1" ~ 2;

That is already valid code, because `int` implicitly converts to 
`dchar`, which can be appended to a string. E.g. `"1" ~ 42` gives 
`"1*"`. (BTW I don't think integer types should implicitly 
convert to character types). I trust you see how implicit 
conversions can get complicated in combination with operators.


More information about the Digitalmars-d-learn mailing list