我有这段代码:
template<
class T = const int &
> void f(T) {}
void f(const int &) {}
int main() {
f(0);
}
为什么要拨打第二个而不是第一个?我认为它们是相同的,但它们显然不是因为我没有得到重新定义错误。
答案 0 :(得分:21)
因为第二个重载不是模板。
当模板函数和非模板函数都可用于解析函数调用时,选择非模板函数。
来自C ++ 11标准的第13.3.3 / 1段:
[...]鉴于这些定义,如果对于所有参数i,ICSi(F1)不是更差的转换,则可行函数F1被定义为更好的函数而不是另一个可行函数F2序列比ICSi(F2),然后[...] F1是非模板函数,F2是函数模板专业化 [...]
答案 1 :(得分:6)
一个是模板,另一个不是,它们肯定不一样。
重载分辨率旨在优先于模板化函数的非模板,其他条件相同。