为什么两个字符串文字中最大值的输出是错误的?

Why is the output of the maximum of two string literals wrong?

谁能解释一下,为什么这段代码的输出是“C”?

#include <iostream>
using namespace std;
template<class X>
X maximum(X a,X b)
{
    if(a > b)
        return a;
    else 
        return b;
}

int main() {
    cout << maximum("C","D") << endl;
}

请注意,在您的情况下,类型 X 将被推断为 const char*,因此您正在比较两个 const char *,即两个字符串文字的地址。

如果你想得到预期的结果,使用类似下面的东西

cout << maximum("C"s, "D"s) << endl;

传递 std::strings 而不是传递字符串文字的地址。

string literal operator

Demo

或者使用字符而不是使用字符串文字,即 'C''D',在这种情况下,X 将被推断为 char

Why is "using namespace std;" considered bad practice?

当你使用maximum("C","D")时,模板参数是char const*。你最终比较了两个指针。无法保证哪个指针会更大。你有不确定的行为。

如果要比较字符串"C"和字符串"D",可以使用:

cout << maximum(std::string("C"), std::string("D")) << endl; // or
cout << maximum("C"s, "D"s) << endl;                         // or
cout << maximum<std::string>("C", "D");

如果您只想比较字符 CD,您应该使用

cout << maximum('C', 'D') << endl;

如果您希望它也适用于 cstring-literals,请添加专业化。

#include <cstring>

template<class X>
X maximum(X a, X b)
{
    return a > b ? a : b; 
}

template<>
char const* maximum<char const*>(char const* a, char const* b)
{
    return std::strcmp(a, b) > 0 ? a : b;
}