Неопределенность перегрузки в C ++: преобразование или продвижение примитивных типов

В этом коде:

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Преобразование.

Поскольку первый аргумент является точным соответствием для обеих перегрузок, он не считается. Но что касается второго параметра, его ранг на первой перегрузке (повышение) лучше, чем ранг на втором (преобразование).

Почему существует неоднозначность разрешения вместо выбора первой перегрузки?

4

Решение

int в long это преобразование. short в int это продвижение (См. [Conv.prom] для полного списка интегральных рекламных акций.)

Так же, float в double это продвижение с плавающей запятой. double в long double это преобразование.

8

Другие решения

5 по умолчанию типа int, Итак, у вас есть конверсии в обоих случаях:

  • int в long int (ака long)
  • int в float

1) long не совместим с intпотому что на определенные модели данных их размер может отличаться.

2) int в float это преобразование, определенное как «Плавающие — интегральные преобразования»:

Перечисление типа integer или unsoped может быть преобразовано в тип prvalue любого типа с плавающей запятой. Если значение не может быть представлено правильно, то реализация определяется, будет ли выбрано самое близкое более высокое или самое близкое нижнее представимое значение.

1

Потому что нет точного соответствия в любом случае. 5, без квалификации, имеет тип int. Ваши методы объявляют «float» или «long int» в качестве аргумента, и и то и другое требуют преобразования. long! = int!

0
По вопросам рекламы [email protected]