Подтвердить что ты не робот

Почему функция перегрузки генерирует неоднозначную ошибку в С++?

В следующих фрагментах кода: В вызове функции f(1), 1 - литерал типа int, а в первой функции void f(double d) тип аргумента - double, а второй тип аргумента void f(short int i) - short int.

Здесь 1 - это тип int, а не тип double, затем Почему компилятор генерирует неоднозначную ошибку?

#include <iostream>
using namespace std;

void f(double d)  // First function
{
    cout<<d<<endl;
}

void f(short int i) // Second function
{
    cout<<i<<endl;
}

int main()
{
    f(1); // 1 is a literal of type int
    return 0;
}
4b9b3361

Ответ 1

Потому что, как ваши комментарии, 1 является литералом типа int.

Для компилятора неявное преобразование int в short int равно как и неявное преобразование int в double (см. стандарт языка С++, §13.3).

Таким образом, поскольку компилятор не может решить перегрузки double и short int, он отказывается и выдает диагностику.

Обратите внимание, что значение параметра функции не имеет значения: просто тип.

(Было бы очень неприятно, если бы компилятор во время выполнения выбрал перегрузку short int, если вызывающий аргумент был подходящим, и double один в других экземплярах.)