1) Dieses Ergebnis ist nicht spezifiziert.
2) Dieses Ergebnis ist nicht spezifiziert. *
3) Ja.
Der relevante Abschnitt in der Norm ist §5.9/2. Relationale Vergleiche zwischen den Zeigern und p
q
sind nur angegeben, wenn:
p
q
und auf dasselbe Objekt oder die Funktion, einen Punkt hinter dem Ende desselben Arrays oder beide null sind. In diesem Fall sind p <= q
und p >= q
wahr, und p < q
und p > q
sind falsch.
p
und q
Punkt auf nicht statische Datenelemente des gleichen Objekts, vergleicht der Zeiger auf das später deklarierte Mitglied größer. (Hinweis: Dieser Vergleich kann nicht zwischen Zugriffsbezeichnern erfolgen.)
p
und q
zeigen Sie auf Elemente innerhalb desselben Arrays oder nach dem Ende des Arrays, den Zeiger auf das Element mit dem höheren Index oder auf eins nach dem Ende von Das Array vergleicht größer.
p
und q
zeigen auf Datenelemente des gleichen Union-Objekts, in diesem Fall vergleichen sie gleich.
In allen anderen Fällen ist das Ergebnis nicht angegeben.
* Da sie statisch sind, erhalten sie (offensichtlich) nicht die "nonstatic member" -Regeln. Sie werden in einer Übersetzungseinheit definiert und sind daher genau wie jeder andere Zeiger. (Nicht bekannt.)
Hinweis! Es gibt einen Weg totale Ordnung zu bekommen, und das ist über std::less<void*>
Dies ist §20.3.3/8 (und alle anderen Vergleichsfunktionsobjekte.):
Für Vorlagen greater
, less
, greater_equal
, und less_equal
, ergeben die Spezialisierungen für jeden beliebigen Zeigertyp eine Gesamtbestellung, auch wenn die eingebauten Operatoren <
, >
, <=
, >=
dies nicht tun.
So, während Sie wissen nicht, ob std::less<void*>(&gFirst, &gSecond)
true
oder false
ist, werden Sie garantiert:
std::less<void*>(&gFirst, &gSecond) ==
std::greater<void*>(&gSecond, &gFirst);
std::less<void*>(&Data::First, &Data::Second) ==
std::greater<void*>(&Data::Second, &Data::First);
Welche nützlich erweisen können.
Zu 1) Ich denke, die Reihenfolge der Initialisierung in einer Quelldatei ist garantiert. Die Initialisierungsreihenfolge von mehreren Quelldateien ist nicht definiert. –
Ich war schlampig mit Frage 2 für die Annahme, Sie würden auch die Daten in einer anderen Datei in der gleichen Reihenfolge initialisieren, wie die Variablen hier deklariert sind. Mein Fehler. Dieser 2. Fall ist eigentlich derjenige, an dem ich mich am meisten interessiere. – zeroes00