use*_*677 18 c++ templates overloading c++11
我有这个代码:
template<
class T = const int &
> void f(T) {}
void f(const int &) {}
int main() {
f(0);
}
Run Code Online (Sandbox Code Playgroud)
为什么称它为第二个而不是第一个?我会认为它们是相同的,但它们显然不是因为我没有得到重新定义错误.
And*_*owl 21
因为第二个重载不是模板.
当模板函数和非模板函数都可用于解析函数调用时,选择非模板函数.
从C++ 11标准的第13.3.3/1段开始:
[...]鉴于这些定义,可行函数F1被定义为比另一个可行函数F2 更好的函数,如果对于所有自变量i,ICSi(F1)不是比ICSi(F2)更差的转换序列,然后[ ...] F1是非模板函数,F2是函数模板专业化 [...]