为什么带有“相同签名”的模板和非模板函数的重载调用非模板函数?

时间:2013-02-02 20:30:29

标签: c++ templates c++11 overloading

我有这段代码:

template<
    class T = const int &
> void f(T) {}

void f(const int &) {}

int main() {
   f(0);
}

为什么要拨打第二个而不是第一个?我认为它们是相同的,但它们显然不是因为我没有得到重新定义错误。

2 个答案:

答案 0 :(得分:21)

因为第二个重载不是模板。

当模板函数和非模板函数都可用于解析函数调用时,选择非模板函数。

来自C ++ 11标准的第13.3.3 / 1段:

  

[...]鉴于这些定义,如果对于所有参数i,ICSi(F1)不是更差的转换,则可行函数F1被定义为更好的函数而不是另一个可行函数F2序列比ICSi(F2),然后[...] F1是非模板函数,F2是函数模板专业化 [...]

答案 1 :(得分:6)

一个是模板,另一个不是,它们肯定不一样。

重载分辨率旨在优先于模板化函数的非模板,其他条件相同。