3

为了研究函数模板的重载,我写了两个函数:

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 函数都是可行的函数并且具有相同的转换等级(非常量到常量和数组到指针),据说在这种情况下,模板函数应该从一组可行的功能。

谁能告诉我为什么?谢谢你考虑我的问题!

4

1 回答 1

3

对于第一次调用,T = char[6]比转换为更好的匹配char const *,因此模板获胜。

对于第二次调用,没有单个模板参数可以用于数组,因此非模板重载是唯一匹配的。

如果你说,

pe16_61_compare(static_cast<char const *>(const_arr_1),
                static_cast<char const *>(const_arr_2));

那么模板实例和普通函数都是可行的并且具有相同的签名,但是作为决胜局,非模板函数获胜(即这不是模棱两可的)。

于 2012-11-25T20:12:36.503 回答