2) Вы имеете в виду следующее?
int mul(int a, int b);
int mul(int n, ...);
Предположим, что первое умножает 2 целых числа. Второй умножает n
целых чисел, переданных var-args. Вызов с f(1, 2)
не будет двусмысленным, потому что аргумент, переданный через «многоточие», связан с максимально возможной стоимостью. Однако передача аргумента параметру того же типа связана с наименьшими возможными затратами. Так что этот самый вызов наверняка резолвится на первую функцию :)
Обратите внимание, что разрешение перегрузки сравнивает только преобразование аргумента с параметром для одной и той же позиции. Это сильно потерпит неудачу, если какая-либо функция для некоторой пары параметров имеет победителя. Например
int mul(int a, int b);
int mul(double a, ...);
Представьте, что первое умножает два целых числа, а второе умножает список двойных чисел, оканчивающийся знаком 0.0
. Этот набор перегрузки ошибочен и будет неоднозначным при вызове
mul(3.14, 0.0);
Это потому, что вторая функция выигрывает для первого аргумента, но первая функция выигрывает для второго аргумента. Не имеет значения, что стоимость конверсии для второго аргумента выше для второй функции, чем стоимость первого аргумента для первой функции. Как только такая ситуация «перекрестного» победителя определена, призыв к таким двум кандидатам становится двусмысленным.
person
Johannes Schaub - litb
schedule
14.10.2009