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