2015-07-01 7 views

Antwort

14

"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.

+0

Das Ergebnis des Vergleichs ist nicht spezifiziert, nicht undefiniert. –

+0

@ 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

+0

Letzter Satz von [expr.rel]/p4. Guter Punkt über die strenge schwache Ordnung, obwohl. –

12

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.

+0

Warum ist das Verhalten undefiniert? –

+4

@ P45Imminent: Der Operator '<' für Zeigeroperanden ist nur für Zeiger auf Unterobjekte desselben gemeinsamen Objekts definiert. –

+0

Danke. Upvoted! –