Analogamente alla legalità di delete this
, this
è consentito anche l' inserimento di nuovi utenti a quanto ne so. Inoltre, per quanto riguarda se this
o in seguito è possibile utilizzare altri puntatori / riferimenti preesistenti, esistono alcune restrizioni:
[Basic.life]
Se, al termine della durata di un oggetto e prima che la memoria di cui l'oggetto occupato sia riutilizzato o rilasciato, viene creato un nuovo oggetto nella posizione di memoria occupata dall'oggetto originale, un puntatore che puntava all'oggetto originale, un riferimento che riferito all'oggetto originale, oppure il nome dell'oggetto originale farà automaticamente riferimento al nuovo oggetto e, una volta iniziata la durata del nuovo oggetto, può essere utilizzato per manipolare il nuovo oggetto, se:
- la memoria per il nuovo oggetto si sovrappone esattamente alla posizione di memoria occupata dall'oggetto originale e
- il nuovo oggetto è dello stesso tipo dell'oggetto originale (ignorando i qualificatori cv di livello superiore) e
- il tipo di oggetto originale non è const-qualificato e, se un tipo di classe, non contiene alcun membro di dati non statico il cui tipo è const-qualificato o un tipo di riferimento e
- né l'oggetto originale né il nuovo oggetto sono un oggetto secondario potenzialmente sovrapposto ([intro.object]).
I primi due sono soddisfatti in questo esempio, ma gli ultimi due dovranno essere presi in considerazione.
Per quanto riguarda il terzo punto, dato che la funzione non è qualificata, dovrebbe essere abbastanza sicuro supporre che l'oggetto originale non sia const. L'errore è sul lato chiamante se la costanza è stata eliminata. Per quanto riguarda il membro const / reference, penso che possa essere verificato affermando che questo è assegnabile:
static_assert(std::is_trivial_v<A> && std::is_copy_assignable_v<A>);
Naturalmente, poiché l'assegnabilità è un requisito, potresti invece semplicemente utilizzare il *this = {};
quale mi aspetterei di produrre lo stesso programma. Un caso d'uso forse più interessante potrebbe essere il riutilizzo della memoria di *this
un oggetto di un altro tipo (che non soddisferebbe i requisiti per l'utilizzo this
, almeno senza reinterpretazione + riciclaggio).
Analogamente delete this
, il posizionamento nuovo this
potrebbe difficilmente essere descritto come "sicuro".