Шаблонные функции C ++ разрешают перегрузку

У меня есть следующий код:

#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)
}

#1 вызовы по линииf(T), в то время как#2 вызовы по линииf(bool).

Почему это происходит? А каковы правила выбора перегруженной функции шаблона?

ОБНОВИТЬ

Я понял, что при первом вызове компилятор просто не может вывестиT при попытке вызвать вторую функцию, поэтому выбирается первая.

Во втором вызове вторая функция считается более подходящей для gcc, а первая выбрана в соответствии с VS2013. Кто здесь правильно делает? Кстати, меня все еще интересует полное описание процесса.

Ответы на вопрос(2)

Ваш ответ на вопрос