В C++ вызов неоднозначен: преобразования int в double и unsigned int имеют одинаковый ранг, и ни одна перегрузка не лучше. Значение −10 не участвует в выборе по типу.
Как определяется вызываемая перегрузка функции
В C++ вызов неоднозначен: преобразования int в double и unsigned int имеют одинаковый ранг, и ни одна перегрузка не лучше. Значение −10 не участвует в выборе по типу.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно понять, какая из перегруженных функций test будет выбрана при вызове.
void test(double a)
{
}
void test(unsigned int a)
{
}
int main() {
int a = -10;
test(a);
}
Ответ
В C++ вызов неоднозначен: преобразования int в double и unsigned int имеют одинаковый ранг, и ни одна перегрузка не лучше. Значение −10 не участвует в выборе по типу.
Можно добавить точную перегрузку void test(int) либо явно выбрать нужное преобразование, если оно соответствует смыслу задачи. Приведение отрицательного значения к unsigned меняет его представляемое числовое значение и не должно использоваться только для подавления ошибки.
Пометка блока как C тоже важна: в языке C перегрузки функций по типам параметров вообще нет, и такие два объявления конфликтуют.