我有这样的代码:
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:
[...]根据这些定义,一个可行的函数F1被定义为比另一个可行函数F2 更好的功能,如果对所有的论点我,ICSI(F1)不低于ICSI(F2)更糟糕的转换序列, 然后按[ ...] F1是一个非模板函数和F2是一个函数模板的特 [...]
一个是模板和其他不,他们是绝对不一样的。
重载分析被设计为通过模板函数喜欢一个非模板,其他一切条件相同。