Текст, который вы цитируете, довольно плотный;Вы должны прочитать это внимательно.«F1 лучше, чем F2, если для всех аргументов i
ICSi (F1) не хуже последовательности преобразования , чем ICSi (F2)» - это правда, поскольку две последовательности преобразования одинаковыследовательно, ни один не является хуже, чем другой.Итак, теперь вы переходите к последней части: «, а затем F1 - не шаблонная функция, а F2 - специализация шаблона функции».Это правда, поэтому F1 лучше, чем F2.Подставляя foo()
и foo<int>()
для F1 и F2 соответственно, правило гласит, что foo()
лучше, чем foo<int>()
.
Ой, я ответил на неправильный вопрос.Как отмечается в комментарии, вопрос в том, почему явный вызов foo<int>()
не приводит к foo()
?И ответ таков: foo<int>()
- это вызов явной реализации шаблона, а не вызов перегруженной функции.Рассмотрим:
template <class Ty>
void f(Ty) { }
void f(int);
void g(int);
f(3.14); // calls f<double> (overloaded function call)
f(1); // calls f(int) (overloaded function call)
f<int>(3.14); // calls f<int> (explicit call of template instantiation)
g(3.14); // calls g(int)
В этом примере f<int>
- это название специализации шаблона.Это , а не общая функция с именем f
, поэтому перегрузку не нужно учитывать, как и при вызове g(3.14)
.