Как уже сказал @David, что касается вашего вопроса, нет такой вещи, как "делать предположения". Литералы просто имеют типы, которые являются типами, которые шаблон функции может использовать для вывода типа. Помните, что преобразования считаются частью соответствия шаблона, хотя!
Итак, допустим, у вас есть этот шаблон функции:
template <typename T> void foo(T x, T y);
Тогда, если вы позвоните foo(1, 2)
, это будет вызвано с T = int
.
Если вы скажете foo(1u, 2u)
, вычет будет T = unsigned int
.
Если вы скажете что-нибудь смешанное, например foo(1u, 2)
, предпочтительного совпадения не будет, и компилятор сообщит об ошибке.
Поскольку в C или C ++ нет литерала short
, если вы хотите явно вызвать функцию foo<short>
, вы можете либо сказать так, либо создать временные явные short
аргументы:
foo<short int>(3, 4);
foo<short int>(3u, 4l); // also OK because of conversion
foo(short(3), short(4)); // deduction
Обновление: в свете ваших правок обратите внимание, что, поскольку вы сопоставляете только один аргумент с параметром шаблона, у вас не возникнет проблем с неоднозначным сопоставлением.