В вашем случае
template<> void f<>(int*);
является явной специализацией
template<class T> void f(T*);
базовый шаблон. Это так же, как
template<> void f<int>(int*);
выводится только аргумент шаблона.
Вы даже можете написать:
template<> void f(int*);
с тем же эффектом. Аналогичный случай представлен в cppreference , смотрите раздел Явные специализации шаблонов функций , где написано:
При специализации шаблона функции его аргументы шаблона могут быть опущены, если вычет аргументов шаблона может предоставить их из аргументов функции.
Соответствующая часть стандарта C ++: http://eel.is/c++draft/temp.expl.spec#11.