Разрешение перегрузки всегда работает только с аргументами функции, независимо от того, является ли это шаблоном функции или нет. Для шаблонов функций тип возврата используется до разрешения перегрузки при принятии решения о том, является ли шаблон функции кандидатом. По сути, это работает так:
- Набор возможных функций-кандидатов строится. Для этого рассматриваются функции, которые, возможно, соответствуют аргументам. При просмотре шаблонов функций также определяется, можно ли создать экземпляр интерфейса шаблона функции с помощью выведенных аргументов, и если нет, то функция не включена в набор перегрузки.
- Как только будет создан набор перегрузки, будет определено наилучшее соответствие. Это исключительно смотрит на аргументы и пытается найти вызов функции в наборе кандидатов, который требует наименьшего количества преобразований. Если есть связь, не шаблонные функции предпочтительнее, за исключением того, что функции, принимающие переменные аргументы стиля C, наименее предпочтительны. Если не найдено ни одного совпадения, разрешение перегрузки завершается неудачно, либо не найдено ни одного кандидата, либо возникает неоднозначность.
В указанном выше случае неограниченная версия f()
и версия, для которой разрешено создание только экземпляра, если выведенный тип является T[N]
, одинаково хороши. То есть, если вы передадите T[N]
только этим, вы должны получить двусмысленность. Однако, если аргументы шаблона выводятся так, чтобы соответствовать первой версии, эта версия в любом случае имеет приоритет из-за частичного упорядочения шаблонов функций: в конечном итоге это будет лучшее соответствие.