为什么模板和非模板函数与“同一签名”的超载调用非模板函数?(Why does overload of

2019-07-19 04:14发布

我有这样的代码:

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

void f(const int &) {}

int main() {
   f(0);
}

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

Answer 1:

由于第二超载不是一个模板。

当一个模板函数和非模板函数是解决函数调用都可行,非模板功能选择。

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

[...]根据这些定义,一个可行的函数F1被定义为比另一个可行函数F2 更好的功能,如果对所有的论点我,ICSI(F1)不低于ICSI(F2)更糟糕的转换序列, 然后按[ ...] F1是一个非模板函数和F2是一个函数模板的特 [...]



Answer 2:

一个是模板和其他不,他们是绝对不一样的。

重载分析被设计为通过模板函数喜欢一个非模板,其他一切条件相同。



文章来源: Why does overload of template and non-template function with the “same signature” call the non-template function?