При вызове функции max компилятор выбирает соответствующий типу параметра вариант функции. В данном примере последовательно вызываются все четыре варианта функции.
Если точного соответствия не найдено, выполняются продвижения порядковых типов в соответствии с общими правилами преобразования типов.
Далее выполняются стандартные преобразования типов.
Затем выполняются преобразования типа, заданные пользователем, а также поиск соответствий за счет переменного числа аргументов функций.
Если соответствие на одном и том же этапе может быть получено более чем одним способом, вызов считается неопределенным и выдается сообщение об ошибке.
Для устранения неопределенности можно воспользоваться явным приведением типа.