Por que essa função de modelo não se comporta conforme o esperado?

Eu estava lendo sobre funções de modelo e fiquei confuso com este problema: #include <iostream> void f(int) { std::cout << "f(int)\n"; } template<typename T> void g(T val) { std::cout << typeid(val).name() << " "; f(val); } void f(double) { std::cout <<...