Учитывая следующие две функции, я ожидал бы, что первая перегрузка будет вызвана, если я передам ей std::pair<const char*, std::size_t>
, поскольку она более специфична, чем общий T
.
void foo(const std::pair<const char*, std::size_t>& p)
{
std::cout << "pair" << std::endl;
}
template <class T>
void foo(const T& v)
{
std::cout << "generic" << std::endl;
}
int main()
{
const char* s = "abc";
foo(std::make_pair(s, std::size_t(3)));
}
Однако эта программа выводит:
generic
Почему вторая перегрузка называется вместо перегрузки, которая явно принимает pair
?
Является ли это проблемой компилятора? На данный момент я использую довольно старый компилятор (GCC 4.1.2).
Хм... возможно, это проблема компилятора: