Betrachten wir diesen Beispielcode:
%Vor% In [basic.expr] wird angegeben, dass Zeigerarithmetik als zulässig ist Solange das Ergebnis auf ein anderes Element des Arrays zeigt (oder über das Ende eines Objekts oder des letzten Elements hinaus). Trotzdem ist in dieser Sektion nicht angegeben, was passiert, wenn das Array ein inaktives Mitglied einer Union ist. Ich glaube, es ist kein Problem short_str+15
ist nie UB. Ist es richtig?
Die folgende Frage zeigt deutlich meine Absicht
Wenn Sie return short_str+15;
schreiben, nehmen Sie die Adresse eines Objekts, dessen Lebensdauer möglicherweise noch nicht begonnen hat. Dies führt jedoch nicht zu undefiniertem Verhalten, wenn Sie es nicht dereferenzieren.
[basic.life]/1.2
wenn das Objekt ein Union-Mitglied oder Unterobjekt davon ist, Seine Lebensdauer beginnt erst, wenn dieses Union-Element initialisiert ist Mitglied in der Union oder wie in
[class.union]
beschrieben.
und
[class.union]/1
In einer Union ist ein nicht statisches Datenelement aktiv, wenn dessen Name bezieht sich auf ein Objekt, dessen Lebensdauer begonnen hat und nicht beendet ist (%Code%). Höchstens einer der nicht statischen Datenelemente eines Objekts von Der Union-Typ kann jederzeit aktiv sein, das heißt, der Wert von höchstens eines der nicht statischen Datenelemente kann in einer beliebigen Union gespeichert werden Zeit.
aber
[basic.life]
Bevor die Lebensdauer eines Objekts begonnen hat, aber nach dem Speichern der Objekt wird besetzen wurde zugewiesen, oder nach der Lebensdauer eines Objekt ist beendet und vor dem Speicher, den das Objekt belegt hat wiederverwendet oder freigegeben, jeder Zeiger, der die Adresse des Der Speicherort, an dem sich das Objekt befindet oder befand, kann verwendet werden aber nur in begrenztem Umfang. Für ein Objekt im Bau oder Zerstörung, siehe
[basic.life]/6
. Andernfalls verweist ein solcher Zeiger auf allokiert Speicher ([class.cdtor]
) und den Zeiger verwenden, als ob der Zeiger von Typ void *, ist gut definiert. Die Indirektion durch einen solchen Zeiger ist erlaubt, aber der resultierende Wert kann nur begrenzt verwendet werden, wie unten beschrieben.
- [Liste ohne Bezug zu den Gewerkschaften]
Tags und Links c++ c++11 language-lawyer pointer-arithmetic