Da mesma forma que a legalidade de delete this
, a colocação de novos em this
também é permitida até onde eu sei. Além disso, sobre se this
ou outros ponteiros / referências pré-existentes podem ser usados posteriormente, existem algumas restrições:
[vida básica]
Se, após o término da vida útil de um objeto e antes da reutilização ou liberação do armazenamento ocupado pelo objeto, um novo objeto será criado no local de armazenamento ocupado pelo objeto original, um ponteiro que apontasse para o objeto original, uma referência que referente ao objeto original, ou o nome do objeto original fará referência automaticamente ao novo objeto e, uma vez iniciada a vida útil do novo objeto, pode ser usada para manipular o novo objeto, se:
- o armazenamento para o novo objeto se sobrepõe exatamente ao local de armazenamento que o objeto original ocupava, e
- o novo objeto é do mesmo tipo que o objeto original (ignorando os qualificadores de cv de nível superior) e
- o tipo do objeto original não é qualificado pela const e, se um tipo de classe, não contém nenhum membro de dados não estáticos cujo tipo é qualificado pela const ou um tipo de referência, e
- nem o objeto original nem o novo objeto são um subobjeto potencialmente sobreposto ([intro.object]).
Os dois primeiros são satisfeitos neste exemplo, mas os dois últimos precisarão ser levados em consideração.
Em relação ao terceiro ponto, considerando que a função não é qualificada por const, deve ser bastante seguro assumir que o objeto original não é const. A falha está no lado do chamador se a constância tiver sido descartada. Em relação ao membro const / reference, acho que pode ser verificado afirmando que isso é atribuível:
static_assert(std::is_trivial_v<A> && std::is_copy_assignable_v<A>);
Obviamente, como a atribuição é um requisito, você poderia simplesmente usar o *this = {};
que eu esperaria produzir o mesmo programa. Um caso de uso talvez mais interessante pode ser reutilizar a memória de *this
um objeto de outro tipo (o que falharia nos requisitos de uso this
, pelo menos sem reinterpretar + lavagem).
Semelhante a delete this
, o posicionamento novo no this
dificilmente poderia ser descrito como "seguro".