Resolución de sobrecarga de funciones de plantilla C ++

Tengo el siguiente código:

#include <iostream>

template <typename T>
void f (T) { std::cout << "f(T)" << std::endl; }

template <typename T>
void f (bool) { std::cout << "f(bool)" << std::endl; }

int main ( )
{
    f(true);        // #1 prints f(T)
    f<bool>(true);  // #2 prints f(bool)
}

los#1 llamadas en líneaf(T), mientras#2 llamadas en líneaf(bool).

¿Por qué pasó esto? ¿Y cuáles son las reglas para seleccionar una función de plantilla sobrecargada?

ACTUALIZAR

Comprendí que en el primer compilador de llamadas simplemente no puedo deducirT mientras intenta llamar a la segunda función, por lo que se elige la primera.

En la segunda llamada, la segunda función se considera una mejor coincidencia en gcc, mientras que la primera se elige en VS2013. ¿Quién hace lo correcto aquí? Por cierto, todavía estoy interesado en la descripción completa del proceso.

Respuestas a la pregunta(2)

Su respuesta a la pregunta