Помимо "обычных" соглашений о вызовах для обычных методов, я бы отметил, что операторы несколько своеобразны.
Основной причиной использования const&
вместо передачи по значению является правильность (производительность идет на втором месте, по крайней мере, на мой взгляд). Если ваше значение может быть полиморфным, то копирование означает нарезку объектов, что в целом является неопределенным поведением.
Поэтому, если вы используете передачу по значению, вы четко указываете вызывающей стороне, что объект будет скопирован и он не должен быть полиморфным.
Другой причиной может быть производительность. Если класс маленький и его конструктор копирования тривиален, его можно было бы скопировать быстрее, чем использовать косвенное обращение (подумайте о int-like классе). В других случаях передача по значению может быть быстрее, но в не встроенных случаях они встречаются реже.
Тем не менее, я думаю, что ни одна из них не является реальной причиной, и разработчики просто выбрали это на ровном месте ...
... потому что настоящий WTF (как они говорят) заключается в том, что operator@
должен быть объявлен как свободные функции, чтобы разрешить продвижение аргумента левого аргумента ...
Так что, если они не следовали этому правилу, зачем им было бы возиться с обычным стилем передачи аргументов?