我有这样的代码:为什么使用“相同签名”的模板和非模板函数的重载称为非模板函数?
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);
}
它为什么称之为第二个,而不是第一?我会认为它们是相同的,但它们显然不是,因为我没有得到重新定义的错误。
因为第二次重载不是模板。
当模板函数和非模板函数都可用于解析函数调用时,将选择非模板函数。
从第13.3.3/C++的11标准的1:
[...]根据这些定义,一个可行的函数F1被定义为一个更好功能比另一个可行函数F2如果对于所有参数i,ICSi(F1)不是比ICSi(F2)更差的转换序列,则,然后F1是非模板函数,F2是功能模板专门化 [...]
一个是模板,另一个不是,他们是defin好像不一样。
重载分辨率旨在优先选择模板函数中的非模板,其他任何内容都相等。
http://stacked-crooked.com/view?id=f9aac9532f21077433027f9ae341417b此处呼叫号码2。 – Rapptz
@Rapptz是的,我编辑。 – user2030677