为了研究功能模板的重载,我写了两个函数:
template <typename T>
void pe16_61_compare(const T&, const T&) {
cout <<"template pe16_61_compare(T, T) called" << endl;
}
// plain functions to handle C-style character strings
void pe16_61_compare(const char*, const char*) {
cout <<"normal func pe16_61_compare(...) called" << endl;;
}
然后我定义了一些变量并调用了函数:pe16_61_compare
const char const_arr1[] = "world", const_arr2[] = "hi";
char ch_arr1[] = "world";
// first call
pe16_61_compare(ch_arr1, const_arr1);
// second call
pe16_61_compare(const_arr1, const_arr2);
输出结果为:
template pe16_61_compare(T, T) called
normal func pe16_61_compare(...) called
让我感到困惑的是,第一个调用调用了模板函数。对我来说,对于第一次调用,两个pe16_61_compare函数都是可行的函数,并且具有相同的转换等级(非const到const和数组到指针),并且在这种情况下,应该从模板函数中删除模板函数可行的功能集。
有谁可以告诉我为什么? 感谢您考虑我的问题!
答案 0 :(得分:3)
对于第一次通话,T = char[6]
与转换为char const *
的匹配度更高,因此模板获胜。
对于第二次调用,没有单个模板参数可以用于数组,因此非模板重载是唯一匹配的。
如果你说,
pe16_61_compare(static_cast<char const *>(const_arr_1),
static_cast<char const *>(const_arr_2));
然后模板实例和普通函数都是可行的并具有相同的签名,但作为一个平局破坏者,非模板函数获胜(即这不是模棱两可的)。