De manera similar a la legalidad de delete this
, la colocación de nuevos this
también está permitida hasta donde yo sé. Además, con respecto a si this
, u otros punteros / referencias preexistentes pueden usarse después, hay algunas restricciones:
[basic.life]
Si, después de que la vida útil de un objeto ha finalizado y antes del almacenamiento que el objeto ocupado se reutiliza o libera, se crea un nuevo objeto en la ubicación de almacenamiento que ocupó el objeto original, un puntero que apuntaba al objeto original, una referencia que referido al objeto original, o el nombre del objeto original se referirá automáticamente al nuevo objeto y, una vez que ha comenzado la vida útil del nuevo objeto, puede usarse para manipular el nuevo objeto, si:
- el almacenamiento para el nuevo objeto se superpone exactamente a la ubicación de almacenamiento que ocupaba el objeto original, y
- el nuevo objeto es del mismo tipo que el objeto original (ignorando los calificadores cv de nivel superior), y
- el tipo del objeto original no está calificado const y, si es un tipo de clase, no contiene ningún miembro de datos no estático cuyo tipo esté calificado const o un tipo de referencia, y
- ni el objeto original ni el nuevo objeto es un subobjeto potencialmente superpuesto ([intro.object]).
Los dos primeros están satisfechos en este ejemplo, pero los dos últimos deberán tenerse en cuenta.
Con respecto al tercer punto, dado que la función no está calificada para const, debería ser bastante seguro asumir que el objeto original no es const. La falla está en el lado de la persona que llama si la constidad ha sido desechada. Con respecto al miembro const / reference, creo que puede verificarse afirmando que esto es asignable:
static_assert(std::is_trivial_v<A> && std::is_copy_assignable_v<A>);
Por supuesto, dado que la asignabilidad es un requisito, en su lugar, simplemente puede usar *this = {};
lo que esperaría para producir el mismo programa. Un caso de uso quizás más interesante podría ser reutilizar la memoria de *this
un objeto de otro tipo (lo que no cumpliría los requisitos para su uso this
, al menos sin reinterpretar + lavar).
Similar a delete this
, la ubicación nueva a this
difícilmente podría describirse como "segura".