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

Posted

技术标签:

【中文标题】为啥具有“相同签名”的模板和非模板函数重载调用非模板函数?【英文标题】:Why does overload of template and non-template function with the "same signature" call the non-template function?为什么具有“相同签名”的模板和非模板函数重载调用非模板函数? 【发布时间】:2013-01-17 22:35:25 【问题描述】:

我有这个代码:

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

void f(const int &) 

int main() 
   f(0);

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

【问题讨论】:

stacked-crooked.com/view?id=f9aac9532f21077433027f9ae341417b 在这里呼叫 2 号。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

重载分辨率旨在优先使用非模板而不是模板函数,其他一切都相同。

【讨论】:

以上是关于为啥具有“相同签名”的模板和非模板函数重载调用非模板函数?的主要内容,如果未能解决你的问题,请参考以下文章

从派生类调用重载函数

具有函数模板和重载的 C++ 类

C++中函数模板和模板函数的区别

为啥 Emit 中具有显式重载的接口实现对于公共和非公共的表现不同?

C++ 函数重载,函数模板和函数模板重载,选择哪一个?

函数模板遇上函数重载