$1 $2
Row::updatePair(int, long long) // #1
Row::updatePair(int, long double) // #2
// updatePair(924, 0.0);
// int -> int (#1) // $1#1
// int -> int (#2) // $1#2
//
// double -> long long // $2#1
// double -> long double // $2#2
В этом случае оба преобразования в первой группе являются точными совпадениями, тогда как оба преобразования во второй группе являются преобразованиями. Они одинаково оценены - это как int -> long
vs int -> double
. Другой вызов имеет одни и те же типы, только разные значения, поэтому он демонстрирует то же поведение.
Только float -> double
является продвижением по службе, как и только целые типы, меньшие, чем int для int (и для некоторых экзотических платформ для unsigned int) - это рекламные акции. Таким образом, следующий не будет неоднозначным
$1 $2
Row::updatePair(int, double) // #1
Row::updatePair(int, long double) // #2
// updatePair(924, 0.0f);
// int -> int (#1) // $1#1
// int -> int (#2) // $1#2
//
// float -> double // $2#1 (promotion - not a ranked as conversion).
// float -> long double // $2#2
В этом случае, второй аргумент имеет лучшую последовательность преобразования при преобразовании в параметре #1
.
Давайте посмотрим больше вашего кода, особенно код, который вызывает updatePair – Mark
Кстати, это законно назвать это «компиляция ** r ** error»? Может быть, это должно звучать как «ошибка компиляции»? –
does updatePair имеет значение по умолчанию для второго аргумента? – shoosh