2013-02-02 86 views
18

我有这样的代码:为什么使用“相同签名”的模板和非模板函数的重载称为非模板函数?

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

void f(const int &) {} 

int main() { 
    f(0); 
} 

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

+2

http://stacked-crooked.com/view?id=f9aac9532f21077433027f9ae341417b此处呼叫号码2。 – Rapptz

+0

@Rapptz是的,我编辑。 – user2030677

回答

19

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

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

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

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

+1

然后,也许作为一个侧面的问题,你可以回答为什么[它在这一个叫#2?](http://stacked-crooked.com/view?id=f9aac9532f21077433027f9ae341417b)这实际上只是导致问题也改变了。 – Rapptz

+0

@Rapptz:正是因为#2不是模板。我错过了什么吗? –

+0

阅读理解有点偏离。 – Rapptz

6

一个是模板,另一个不是,他们是defin好像不一样。

重载分辨率旨在优先选择模板函数中的非模板,其他任何内容都相等。