Sobrescribir un objeto con un objeto del mismo tipo

¿Está bien definido lo siguiente?

#include <iostream>
#include <string.h>

using namespace std;

struct Const {
    const int i; 
    Const (int i) : i(i) {}
    int get0() { return 0; } // best accessor ever!
};

int main() {
    Const *q,*p = new Const(1);
    new (p) Const(2);
    memcpy (&q, &p, sizeof p);
    cout << q->i;
    return 0;
}

Tenga en cuenta que después de la construcción del segundoConst, p&nbsp;no apunta semánticamente (¿intencionalmente?) a un nuevo objeto, y el primero se ha ido, por lo que se puede usar "como unvoid*". Pero el segundo objeto se construye exactamente en la misma dirección, por lo que el patrón de bits dep&nbsp;representa la dirección del nuevo objeto.

COMENTARIO

new (p) Const(2)&nbsp;borrar el objeto antiguo almacenado enp, por lo que el puntero ya no es válido, excepto como puntero al almacenamiento (void*)

Quiero recuperar el valor dep&nbsp;como unConst*.

COMENTARIO 2

Después de cualquierap->~Const()&nbsp;omemset (p, 0, sizeof *p)&nbsp;está claro quep&nbsp;no apunta a un objeto válido, entoncesp&nbsp;solo se puede usar como puntero al almacenamiento (void*&nbsp;ochar*), por ejemplo para reconstruir otro objeto. En ese puntop->get0()&nbsp;No se permite.

Aquí la demolición del objeto antiguo la realiza el constructor del nuevo, pero no creo que eso marque la diferencia.

Mi intuición es que:En cualquier caso, el viejo objeto se ha ido, yp&nbsp;señala el objeto antiguo, no el nuevo.

Estoy buscando unconfirmación o refutación&nbsp;basado en el estándar.

VER TAMBIÉN

He hecho esencialmente la misma pregunta sobre punteros, en C y C ++:

Desreferenciar un puntero fuera de límite que contiene la dirección de un objeto (matriz de matriz)¿La memoria de un puntero es lo mismo que la asignación?¿Las variables de puntero son enteros con algunos operadores o son "místicas"?

Lea estas discusiones antes de responder "esto es ridículo".