как вывести параметр шаблона в явной специализации шаблона функции?

рассмотрим следующий случай:

#include <iostream>template <class t> void f(t) { std::cout << "#1\n"; } // #1template <> void f(const int) { std::cout << "#2\n"; } // #2int main() {    f<const int>(1); // call #1    f<int>(1);       // call #2    return 0;}
f<int>(const int)f<const int>(const int)constvoid(int)f<int>(const int)

кажется, #2 вместо . что здесь происходит? моей первой мыслью было на высшем уровне отбрасывается в функции преобразования типа, так что типа #2 , который приводит к специализации . но я не уверен в этом.

template <> void f<int>(const int) { }template <> void f<int const>(const int) { }

и почему c допускает такой синтаксис? я имею в виду, так как мы не можем частичной специализации шаблонов функций, мы бы знали значение аргумента шаблона, если мы хотим явно специализируется один. так почему c не просто заставить программиста явно дает значения аргумента шаблона, когда специализировать шаблон функции? (т. е. мы должны написать специализацией #1 в или ) не имеет специального использования, кроме как для удобства кодирования?