2015-04-21 1 views
4

В этом коде: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); 

} 

есть неоднозначность. Check it out!. Однако второй аргумент представляет собой целое число со знаком. Привязка int к параметру long int требует повышения, но до float, преобразования.

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

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

ответ

8

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

Аналогичным образом float - double является продвижением с плавающей запятой. double до long double является конвертация.

0

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

1

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

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

1)long не совместим с int, потому что на certain data models их размер может отличаются.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^