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
诸如 a
、b
等是具有明确定义的小于比较的整数类型。而 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>
比较字符串。
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
诸如 a
、b
等是具有明确定义的小于比较的整数类型。而 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>
比较字符串。