В кн. Полное шаблонное руководство второго издания (глава 16) .Было упомянуто, что одно специальное правило для частичного упорядочения двух совпадающих шаблонов функций заключается в том, что аргументы, поступающие из пакета параметров, не могут сопоставляться с невариантной шаблонной функцией.Я был удивлен, прочитав это, потому что я всегда писал код, подобный приведенному ниже образцу, который в конечном расширении соответствует не шаблонной функции.
#include <iostream>
template <typename T>
void f(T && t)
{
std::cout << "HelloWorld!" << std::endl;
}
template <typename Head, typename ... Tail>
void f(Head && head, Tail && ... tail)
{
std::cout << head << std::endl;
f(std::forward<Tail>(tail)...);
}
int main()
{
f(1,2,3);
}
Вывод
1
2
HelloWorld!