неявная последовательность преобразования при перегрузке функций

Я не понимаю, как компилятор выбирает лучших кандидатов. Например, пусть у нас есть следующий код:

int function(double, int, int){...}
int function(int, double, double){...}

Если второй функции нужно преобразовать две переменные, а первой — только одну переменную, почему первая не выбрана? Почему неоднозначная ситуация?


person greg phillip    schedule 13.09.2014    source источник
comment
А если есть четыре параметра, и один лучше по двум, а другой лучше по двум другим, они уходят в овертайм, а потом делают пенальти? Лучшее совпадение должно быть лучше или равно по каждому параметру. Это не соревнование по очкам.   -  person Igor Tandetnik    schedule 13.09.2014


Ответы (1)


Почему неоднозначная ситуация?

Согласно §13.3.3/1,

С учетом этих определений жизнеспособная функция F1 определяется как лучшая функция, чем другая жизнеспособная функция F2, если для всех аргументов i, ICS i (F1) не хуже, чем ICS i (F2), а затем

— для некоторого аргумента j ICS j (F1) является лучшей последовательностью преобразования, чем ICS j (F2), или, если не так,

— [...]

Поэтому такой вызов, как function(0., 0., 0.), неоднозначен; Ни одна из перегрузок не подходит лучше другой.

Рассмотрим вывод аргумента шаблона из вызова функции - если параметр шаблона T используется в нескольких параметрах функции (например, T a, T b, T c) и для двух аргументов вызова он выводится как int, а для третьего как double, если это действительно привести к успешному вычету с T=int?

Разрешение перегрузки не учитывает лучшие совпадения и не называет победителя - это было бы недостаточно решающим фактором.

Представьте себе головоломку — действительно ли кусок лучше подходит для пробела, если он лучше заполняет два конца, но хуже — другой?

person Columbo    schedule 13.09.2014