调用模板函数的奇怪行为

MD.*_*sar -1 c++ templates function template-function

我写了以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

template function: x
template function: y
non-template function: y
Run Code Online (Sandbox Code Playgroud)

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

另外为什么第二次函数调用的输出y不应该是x?使用字符串常量调用函数和char类型数组之间有什么区别,尽管两者都是字符串?

Dav*_*eas 5

C++中的文字具有N个常量字符的类型数组,并且会衰减为指向常量字符的指针,该字符串无法转换为char*.如果要为C样式字符串提供重载,则应该:

const char *Min(const char *a, const char *b)
Run Code Online (Sandbox Code Playgroud)

在C++中,技术上未定义比较不属于同一个完整对象的指针.实际上,它意味着比较两个不等式指针的结果可能是这样或那样,并且不能保证.当选择模板时,它将比较衰减字符串文字后获得的指针的值,并且恰好在这种情况下"y"的地址恰好小于"x"的地址,但是没有保证无论如何.

  • 我只是将其编辑成答案...比较的结果是未定义的,并且恰好在这种特殊情况下文字"y"的字母小于文字"x". (2认同)
  • @KhairulBasar:你应该阅读一些关于C++语言的介绍性文章.类型`const char*`和类型`char*`是不同的类型,前者不允许修改指向的数据,而后者允许它.在这种特殊情况下,它完全有意义,能够修改字符串文字是没有意义的...... (2认同)