Страницы

Поиск по вопросам

пятница, 19 октября 2018 г.

Почему при вызове `max(int, long long)` аргумент типа int не расширяется до long long?

Скажите, пожалуйста, почему этот код:
int x = 1; long long y = 1; cout << max(x, y) << endl;
не скомпилируется с ошибкой
no matching function for call to 'max(int&, long long int&)'
Есть ведь функция max(long long, long long), что мешает аргументу типа int автоматически преобразоваться в long long?
(чтобы скомпилировалось надо явно преобразовать аргумент типа int к long long, это я знаю)


Ответ

Никакой "функции max(long long, long long)" нет.
Речь идет о стандартном std::max. И надо иметь в виду, что std::max - это шаблон. Тип аргументов std::max заранее не задан - он является шаблонным параметром. Шаблон этот лишь определен так, что тип аргументов функции должен быть одинаковым.
Из вашего вызова max(x, y) компилятор не может угадать, какой именно тип аргумента std::max вы хотели получить. Может быть вы хотели использовать long long в качестве общего типа. А может быть вы хотели использовать int в качестве общего типа.
Выполнить дедукцию шаблонного аргумента в такой ситуации компилятор не может и компиляция заканчивается с ошибкой. Т.е. проблема заключается именно в невозможности дедукции шаблонного аргумента для std::max
В данном случае вы можете, например, "подавить" дедукцию шаблонного аргумента, т.е. указать тип шаблонного аргумента явно вручную
max(x, y)
и тогда действительно аргумент типа int будет неявно преобразован к типу long long, как вы и хотели.

Комментариев нет:

Отправить комментарий