Я знаю, что спецификация языка запрещает частичную специализацию шаблона функции.
Я хотел бы знать, почему это запрещено? Разве они не полезны?
template<typename T, typename U> void f() {} //allowed!
template<> void f<int, char>() {} //allowed!
template<typename T> void f<char, T>() {} //not allowed!
template<typename T> void f<T, int>() {} //not allowed!