未调用更具体的过载

More specific overload not called

本文关键字:调用      更新时间:2023-10-16

给定以下两个函数,如果我向第一个重载传递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)。

嗯。。。这可能是编译器的问题:

http://ideone.com/97XwwZ

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

这似乎只是编译器的问题。我使用的是一个旧的编译器(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)));
}

根据重载解决方案,它应该更喜欢示例中的特定解决方案。

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

pair

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