gpt4 book ai didi

c++ - 为什么 std::max 不适用于字符串文字?

转载 作者:行者123 更新时间:2023-12-04 12:13:54 27 4
gpt4 key购买 nike

我试图找到两个字符串的最大值,它在第一种情况下(传递 std::string 变量时)给出了正确答案,但在第二种情况下(传递直接字符串时)给出了错误。

#include<bits/stdc++.h>
using namespace std;

int main()
{
// Case 1
string str1 = "abc", str2 = "abcd";
cout << max(str1, str2) << endl;

// Case 2
cout << max("abc", "abcd") << endl;
}

最佳答案

在你的第二种情况下,

std::cout << std::max("abc", "abcd") << std::endl;
它们是字符串文字,其中 "abc"有类型 char const [4]"abcd"有类型 char const [5] .
因此,在函数调用 std::max("abc", "abcd") , std::max必须推断
auto max(char const (&a)[4], char const (&b)[5]) {
return a < b ? b : a;
}
这是不可能的,因为 std::max 没有函数模板重载,它采用不同的类型作为模板参数。因此,错误!

警告!
如果你明确提到模板类型 const char*std::max ,这本来可以编译的。这是因为,对于 "abc""abcd"类型也可以是 const char* s 由于数组到 C++ 中的指针衰减。
 std::cout << std::max<const char*>("abc", "abcd" ) << '\n';  // compiles
^^^^^^^^^^^^^
此外, std::initializer_list std::max 过载,反过来也会推导出上面的 const char*作为模板类型:
std::cout << std::max({ "abc", "abcd" }) << '\n';   // compiles
然而, 你不应该这样做 !
@AlanBirtles指出,这会导致 undefined behavior ,由于 std::max将比较两个不同数组的指针。结果无法中继,应该做上面的。使用 std::string与您的第一种情况进行比较。使用 string literals (从 C++14 开始),您可以做一个最小的更改,并进行第二种情况,与第一种情况相同:
#include <string>
using namespace std::string_literals;

std::cout << std::max("abc"s, "abcd"s) << '\n';

作为旁注,请参阅以下内容:
  • Why should I not #include <bits/stdc++.h>?
  • Why is "using namespace std;" considered bad practice?
  • 关于c++ - 为什么 std::max 不适用于字符串文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69127974/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com