max({"a", "b", "z", "x"}); returns "x"
während beideC++ 's max() mit Initialisiererliste kehrt Strings aus der Ordnung
max<std::string>({"a", "b", "z", "x"});
und
max({'a', 'b', 'z', 'x'});
return "z", wie sie sollen. Warum?
max({"a", "b", "z", "x"}); returns "x"
während beideC++ 's max() mit Initialisiererliste kehrt Strings aus der Ordnung
max<std::string>({"a", "b", "z", "x"});
und
max({'a', 'b', 'z', 'x'});
return "z", wie sie sollen. Warum?
"a"
, "b"
usw. sind Zeichenfolgenliterale. Diese fallen in der Initialisierungsliste auf const char*
ab. max
nur
wahrscheinlich erhält die mit der höchsten Adresse, aber da es operator<
verwendet, um sie zu vergleichen, und sie sind nicht Teil des gleichen Array oder eins nach dem gleichen Array, das Ergebnis des Vergleichs ist nicht angegeben (und der Aufruf von max
würde zu undefiniertem Verhalten führen, da die Anforderung ist, dass der Typ LessThanComparable
ist).
Die anderen beiden Aufrufe von max
sind gut definiert. char
s wie a
, b
usw. sind integrale Typen mit einem gut definierten weniger als Vergleich. Und std::string
hat eine operator<
, die einen lexikografischen Vergleich implementiert.
max({"a", "b", "z", "x"});
versucht, Zeiger zu vergleichen. Dies hat ein undefiniertes Verhalten (da die Ergebnisse der einzelnen Vergleiche nicht spezifiziert sind). Es Sie wollten Zeiger vergleichen, sollten Sie schreiben:
std::max({"a", "b", "z", "x"}, std::less<const char*>());
Demgegenüber vergleicht max({'a', 'b', 'z', 'x'});
Integralwerte und max<std::string>
vergleicht Strings.
Warum ist das Verhalten undefiniert? –
@ P45Imminent: Der Operator '<' für Zeigeroperanden ist nur für Zeiger auf Unterobjekte desselben gemeinsamen Objekts definiert. –
Danke. Upvoted! –
Das Ergebnis des Vergleichs ist nicht spezifiziert, nicht undefiniert. –
@ T.C. Hast du die Referenz dafür? Ich denke, wenn es nicht spezifiziert wäre, würde es immer noch einen Aufruf unter "max" undefiniert machen, indem es keine strenge schwache Ordnung bereitstellt. – juanchopanza
Letzter Satz von [expr.rel]/p4. Guter Punkt über die strenge schwache Ordnung, obwohl. –