A good example for overloading are set operations, because the logic is "compatible".
- X * Y intersection
- X + Y join
- X - Y difference
- - X complement
I don't see how the logic is compatible, unary - as complement means X - Y is different from X + (-Y). And there's just no relation between * and + anymore. At least with + for concatenation (which I already don't like much), you can have STRING * 3 to be equivalent to STRING + STRING + STRING.
And actually now that I think of it, the best operator to overload to append to a file is .=. With the dot you have both the append and string semantic, and the = makes it ok for the operation to have an effect on the left operand. And it makes chaining more consistent:
file("path") .= "First string" . "Second string";