В этом коде:
void f(float f, long int i) { cout << "1" << endl; }
void f(float f, float d) { cout << "2" << endl; }
int main() {
f(5.0f, 5);
}
есть двусмысленность Проверьте это!. Однако вторым аргументом является целое число со знаком. Связывание int
к long int
параметр требует повышения, но для float
Преобразование.
Поскольку первый аргумент является точным соответствием для обеих перегрузок, он не считается. Но что касается второго параметра, его ранг на первой перегрузке (повышение) лучше, чем ранг на втором (преобразование).
Почему существует неоднозначность разрешения вместо выбора первой перегрузки?
int
в long
это преобразование. short
в int
это продвижение (См. [Conv.prom] для полного списка интегральных рекламных акций.)
Так же, float
в double
это продвижение с плавающей запятой. double
в long double
это преобразование.
5
по умолчанию типа int
, Итак, у вас есть конверсии в обоих случаях:
int
в long int
(ака long
)int
в float
1) long
не совместим с int
потому что на определенные модели данных их размер может отличаться.
2) int
в float
это преобразование, определенное как «Плавающие — интегральные преобразования»:
Перечисление типа integer или unsoped может быть преобразовано в тип prvalue любого типа с плавающей запятой. Если значение не может быть представлено правильно, то реализация определяется, будет ли выбрано самое близкое более высокое или самое близкое нижнее представимое значение.
Потому что нет точного соответствия в любом случае. 5, без квалификации, имеет тип int. Ваши методы объявляют «float» или «long int» в качестве аргумента, и и то и другое требуют преобразования. long! = int!