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

Mik*_*ail 10 c++ string max initializer-list c++11

max({"a", "b", "z", "x"});  returns "x"
Run Code Online (Sandbox Code Playgroud)

两者都有

max<std::string>({"a", "b", "z", "x"});
Run Code Online (Sandbox Code Playgroud)

max({'a', 'b', 'z', 'x'});
Run Code Online (Sandbox Code Playgroud)

按原样返回"z".为什么?

jua*_*nza 14

"a","b"等都是字符串文字.这些const char*在初始化列表中衰减.max 只是可能得到一个最高的地址,但由于它使用operator<对它们进行比较,他们是不一样的阵列的一部分,或一过同一个阵列,比较的结果不确定(和调用max会导致未定义的行为,因为要求是类型be LessThanComparable).

另外两个调用max是明确定义的.charS,从而如a,b等等都是整数类型具有良好定义小于比较.并且std::string有一个operator<实现词典比较.


Ker*_* SB 12

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

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

相比之下,max({'a', 'b', 'z', 'x'});比较积分值,并max<std::string>比较字符串.

  • @ P45Imminent:指针操作数的`<`运算符仅定义指向同一公共对象的子对象的指针. (4认同)
  • @juanchopanza是的.[expr.rel]"如果一个指针指向一个数组的一个元素,或指向一个子对象,另一个指针指向一个超过该数组的最后一个元素的指针,后一个指针则指向更大的" (3认同)