带有初始化列表的C ++的max()不按顺序返回字符串

时间:2015-07-01 14:51:53

标签: c++ string c++11 max initializer-list

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

同时

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

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

返回&#34; z&#34;他们应该这样做。为什么呢?

2 个答案:

答案 0 :(得分:14)

"a""b"等是字符串文字。在初始化列表中,这些会衰减到const char*max 只是可能会获得具有最高地址的那个,但由于它使用operator<来比较它们,并且它们不属于同一个数组,或者只有一个在同一个数组中,比较的结果是未指定的(并且max的调用将导致未定义的行为,因为要求是类型为LessThanComparable)。< / p>

max的其他两个调用已明确定义。诸如charab是完整类型,具有明确定义的小于比较。并且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>会比较字符串。