max({"a", "b", "z", "x"}); returns "x"
同时
max<std::string>({"a", "b", "z", "x"});
和
max({'a', 'b', 'z', 'x'});
返回&#34; z&#34;他们应该这样做。为什么呢?
答案 0 :(得分:14)
"a"
,"b"
等是字符串文字。在初始化列表中,这些会衰减到const char*
。 max
只是可能会获得具有最高地址的那个,但由于它使用operator<
来比较它们,并且它们不属于同一个数组,或者只有一个在同一个数组中,比较的结果是未指定的(并且max
的调用将导致未定义的行为,因为要求是类型为LessThanComparable
)。< / p>
max
的其他两个调用已明确定义。诸如char
,a
等b
是完整类型,具有明确定义的小于比较。并且std::string
有一个operator<
来实现字典比较。
答案 1 :(得分:12)
max({"a", "b", "z", "x"});
尝试比较指针。这具有未定义的行为(因为未指定单个比较的结果)。你想比较指针,你应该写:
std::max({"a", "b", "z", "x"}, std::less<const char*>());
相比之下,max({'a', 'b', 'z', 'x'});
会比较整数值,max<std::string>
会比较字符串。