@ehiggs I wish the * -> RetType search pattern was better documented, it’s one “hidden” gem of the rust docs: example for your case (slice::join and slice::concat appear among the first 10 results).
Regarding overloading Add, I agree with @DanielKeep on this one: since adding chars is not very intuitive, adding sequences of chars is not very ambiguous, thus people can see the appeal of it.
But quid of Vec<char>? And Vec<u8>? And Vec<T>? I agree it’s a slippery slope and only a matter of time before those are requested too. But when T : Add, the “sum” of two sequences of T is now ambiguous.
The solution? Do have a fn (String, String) -> String operation (this would solve OP’s use case, for instance), but do not call it Add::add. If you want sugar, other sigils can be used (someone mentioned ~, Ocaml uses @ for list concatenation, but my favorite sugar would be abstracting .. with a trait that remains compatible with the current fn (Idx, Idx) -> Range<Idx> behavior, but that would also allow using it for more general concatenations). But please do not use addition notation.