Для вызова перегруженного operator>
преобразование не требуется. Для вызова встроенного operator>
необходимо одно преобразование (пользовательский оператор преобразования. Разрешение перегрузки предпочитает варианты с меньшим количеством необходимых преобразований, поэтому используется перегруженный operator>
.
Обратите внимание, что если вы измените определение вашего перегруженного operator>
, например:
friend bool operator>(double i, A a);
вы получите ошибку компиляции, потому что и перегруженный operator>
, и встроенный operator>
потребуют одно преобразование, и компилятор не сможет устранить неоднозначность.