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