В этом коде: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
, преобразования.
Поскольку первый аргумент является точным соответствием для обеих перегрузок, он не учитывается. Но в отношении второго параметра его ранг при первой перегрузке (продвижении) лучше, чем ранг второго (конверсия).
Почему существует двусмысленность разрешения, а не выбор первой перегрузки?