Для вызова f()
потребуется два преобразования, одно преобразование, определенное пользователем (C
в B
) и одно встроенное преобразование (производное в основание: B
в A
). Вызовы с несовпадающими аргументами завершаются успешно, когда им требуется ноль или одно пользовательское преобразование. Если различные преобразования (встроенные или определяемые пользователем) будут успешными, то, если все возможные пути равны по количеству / виду необходимых преобразований, вызов неоднозначен, и компилятор должен выдать диагностику.
Как компиляторы реализуют это, стандартом не указано.