C++ 的 max() 初始化列表 returns 字符串乱序

C++'s max() with initializer list returns strings out of order

max({"a", "b", "z", "x"});  returns "x"

同时

max<std::string>({"a", "b", "z", "x"});

max({'a', 'b', 'z', 'x'});

return "z" 因为他们应该。为什么?

"a""b"等都是字符串字面量。在初始值设定项列表中时,这些衰减到 const char*max just 可能得到地址最高的那一个,但是因为它使用 operator< 来比较它们,而且它们不属于同一个数组,或者一次过去相同的数组,比较的结果是未指定的(并且 max 的调用将导致 未定义的行为 ,因为要求类型是 LessThanComparable).

max 的其他两个调用定义明确。 char 诸如 ab 等是具有明确定义的小于比较的整数类型。而 std::string 有一个 operator< 实现了字典序比较。

max({"a", "b", "z", "x"}); 尝试比较指针。这具有未定义的行为(因为各个比较的结果未指定)。如果你想比较指针,你应该写:

std::max({"a", "b", "z", "x"}, std::less<const char*>());

相比之下,max({'a', 'b', 'z', 'x'});比较整数值,max<std::string>比较字符串。