鉴于以下两个函数,如果我将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)。
嗯......这可能是一个编译器问题:
答案 0 :(得分:9)
您的编译器肯定是错误的。它是什么错误,只会是猜测,但你是正确的,这个代码应该提供更具体的输出。样本不够大或不够复杂,无法使任何更微妙的规则成为原因。
答案 1 :(得分:4)
这似乎只是一个编译器问题。我使用的是旧编译器(GCC 4.1.2)。使用较不古老的编译器似乎会导致正确的重载被称为
#include <iostream>
#include <utility>
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)));
}
答案 2 :(得分:0)
根据重载分辨率,它应该更喜欢您的示例中的特定分辨率。
我会说这是由于旧版本而导致的编译器错误。使用GCC 4.8.1编译时。它输出
pair