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

use*_*677 18 c++ templates overloading c++11

我有这个代码:

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

void f(const int &) {}

int main() {
   f(0);
}
Run Code Online (Sandbox Code Playgroud)

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

And*_*owl 21

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

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

从C++ 11标准的第13.3.3/1段开始:

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


Bo *_*son 6

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

过载分辨率设计为优先于模板化函数的非模板,其他条件相同.