Ähnlich wie bei der Legalität von delete this
ist meines Wissens auch eine neue Platzierung this
zulässig. In Bezug darauf, ob this
oder andere bereits vorhandene Zeiger / Referenzen später verwendet werden können, gibt es einige Einschränkungen:
[basic.life]
Wenn nach Ablauf der Lebensdauer eines Objekts und vor der Wiederverwendung oder Freigabe des Speichers, in dem sich das Objekt befindet, ein neues Objekt an dem Speicherort erstellt wird, an dem sich das ursprüngliche Objekt befindet, ein Zeiger, der auf das ursprüngliche Objekt zeigt, ein Verweis darauf Der Verweis auf das ursprüngliche Objekt oder der Name des ursprünglichen Objekts verweist automatisch auf das neue Objekt und kann nach Beginn der Lebensdauer des neuen Objekts zum Bearbeiten des neuen Objekts verwendet werden, wenn:
- Der Speicher für das neue Objekt überlagert genau den Speicherort, den das ursprüngliche Objekt belegt hat, und
- Das neue Objekt ist vom selben Typ wie das ursprüngliche Objekt (ohne Berücksichtigung der Lebenslaufqualifizierer der obersten Ebene)
- Der Typ des ursprünglichen Objekts ist nicht const-qualifiziert und enthält, wenn es sich um einen Klassentyp handelt, kein nicht statisches Datenelement, dessen Typ const-qualifiziert ist, oder einen Referenztyp
- Weder das ursprüngliche noch das neue Objekt sind potenziell überlappende Unterobjekte ([intro.object]).
Die ersten beiden sind in diesem Beispiel erfüllt, die letzten beiden müssen jedoch berücksichtigt werden.
In Bezug auf den dritten Punkt sollte angesichts der Tatsache, dass die Funktion nicht const-qualifiziert ist, ziemlich sicher angenommen werden, dass das ursprüngliche Objekt nicht const ist. Der Fehler liegt auf der Anruferseite, wenn die Konstanz weggeworfen wurde. In Bezug auf const / reference member denke ich, dass dies überprüft werden kann, indem behauptet wird, dass dies zuweisbar ist:
static_assert(std::is_trivial_v<A> && std::is_copy_assignable_v<A>);
Da Zuweisbarkeit eine Voraussetzung ist, können Sie natürlich stattdessen einfach das verwenden, von *this = {};
dem ich erwarten würde, dass es dasselbe Programm erzeugt. Ein vielleicht interessanterer Anwendungsfall könnte darin bestehen, den Speicher *this
für ein Objekt eines anderen Typs wiederzuverwenden (was die Anforderungen für die Verwendung this
zumindest ohne Neuinterpretation + Waschen nicht erfüllen würde ).
Ähnlich wie bei einer delete this
neuen Platzierung kann this
man kaum als "sicher" bezeichnen.