14

鉴于以下两个函数,我希望如果我将第一个重载传递给它,则会调用它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

为什么调用第二个重载,而不是显式采用 a 的重载pair

这是编译器问题吗?目前我碰巧正在使用一个相当旧的编译器(GCC 4.1.2)。

嗯...这可能是编译器问题:

http://ideone.com/97XwwZ

4

3 回答 3

9

你的编译器肯定是错误的。它是什么错误,只是推测,但你是正确的,这段代码应该给出更具体的输出。样本不够大或不够复杂,不足以导致任何更微妙的规则成为原因。

于 2013-08-08T18:22:58.240 回答
4

看来这只是一个编译器问题。我使用的是旧编译器(GCC 4.1.2)。使用不太古老的编译器似乎会导致调用正确的重载

http://ideone.com/97XwwZ

#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)));
}
于 2013-08-08T18:23:18.573 回答
0

根据重载决议,它应该更喜欢您示例中的特定决议。

我会说这是由于旧版本导致的编译器错误。使用 GCC 4.8.1 编译时。它输出

pair

根据此链接:重载分辨率演示

于 2013-08-08T18:22:03.393 回答