Шаблонные функции 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. Кто здесь правильно делает? Кстати, меня все еще интересует полное описание процесса.