-1

我写了以下代码:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
template <class T> T Min(T a, T b)
{
    cout<<"template function: ";
    if(a<b)
        return a;
    return b;
}
char *Min(char *a, char *b)
{
    cout<<"non-template function: ";
    if(strcmp(a,b)==0)
        return a;
    return b;
}
int main()
{
    char c[]="x",d[]="y";

    cout<<Min('x','y')<<endl;
    cout<<Min("x","y")<<endl;
    cout<<Min(c,d)<<endl;

    return 0;
}

输出:

template function: x
template function: y
non-template function: y

第一个函数调用没问题,它正在调用模板函数。但是,为什么第二个函数也调用模板函数,而它是一个字符串常量。它不应该调用非模板函数吗???

还有为什么第二个函数调用的输出是y,不是x吗?尽管两者都是字符串,但使用字符串常量和 char 类型数组调用函数有什么区别?

4

1 回答 1

5

C++ 中的文字具有N 常量 char 类型数组,并且将衰减为指向常量 char的指针,无法转换为char*. 如果你想为 C 风格的字符串提供重载,你应该这样做:

const char *Min(const char *a, const char *b)

在 C++ 中,比较不属于同一个完整对象的指针在技术上是未定义的。实际上,这意味着比较两个指针是否不相等的结果可能会以一种或另一种方式发生,并且不能保证。选择模板时会比较字符串字面值衰减后得到的指针的值,恰好这种情况下“y”的地址恰好小于“x”的地址,但没有保证任何。

于 2014-10-16T02:32:16.110 回答