Компилятор, указанный mc1 == ac1
, будет искать наилучшее совпадение для оператора == (A, B), используя обычные правила разрешения перегрузки для любой функции.
Предполагая, что он находит вашу bool myClass::operator==(const myClass&)
функцию,однозначно наилучшее совпадение (это может быть не так. например, он может найти оператор, объявленный bool operator==(const myClass&, const anotherClass&)
, который имеет более высокий приоритет), затем он будет связывать и выполнять необходимые преобразования параметров, как это было бы для любого вызова функции.
Чтобы выполнить преобразование из lvale типа anotherClass в const myClass&
(при условии, что anotherClass не наследует от myClass, и в этом случае преобразование не потребуется), оно затем будет искать одиночное (однозначно лучшее) преобразованиеконструктор или оператор преобразования для преобразования параметра во временный myClass и последующего выполнения вызова оператора == с этим.
Если параметр функции является неконстантной ссылкойчем он не будет рассматривать выполнение такого временного преобразования.Причина в том, что неконстантная ссылка обычно указывает на то, что функция будет выполнять некоторый побочный эффект для этого параметра, который будет отброшен при уничтожении временного элемента, оставляя исходный объект без изменений - поэтому это, скорее всего, будет логическая ошибка, случайно отбрасывающая этот побочный эффектчем намеренно - так разработчики языка запретили.