Substituindo um objeto por um objeto do mesmo tipo

O seguinte está bem definido?

#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;
}

Observe que após a construção do segundoConst, p não semanticamente (intencionalmente?) aponta para um novo objeto e o primeiro se foi, portanto é utilizável "comovoid*". Mas o segundo objeto é construído exatamente no mesmo endereço, então o padrão de bits dep representa o endereço do novo objeto.

COMENTE

new (p) Const(2) apague o objeto antigo armazenado emp, portanto, o ponteiro não é mais válido, exceto como um ponteiro para armazenamento (void*)

Eu quero recuperar o valor dep como umConst*.

COMENTÁRIO 2

Depois dep->~Const() oumemset (p, 0, sizeof *p) é claro quep não aponta para um objeto válido, entãop só pode ser usado como ponteiro para armazenamento (void* ouchar*), por exemplo, para reconstruir outro objeto. Nesse pontop->get0() não é permitido.

Aqui a demolição do objeto antigo é feita pelo construtor do novo, mas não acho que isso faça diferença.

Minha intuição é que:De qualquer forma, o objeto antigo se foi ep aponta para o objeto antigo, não para o novo.

Estou à procura de umconfirmação ou refutação com base no padrão.

VEJA TAMBÉM

Fiz essencialmente a mesma pergunta sobre ponteiros, em C e C ++:

Desreferenciando um ponteiro fora do limite que contém o endereço de um objeto (matriz da matriz)Memcpy de um ponteiro é o mesmo que atribuição?As variáveis de ponteiro são apenas números inteiros com alguns operadores ou são "místicas"?

Por favor, leia estas discussões antes de responder "isso é ridículo".

questionAnswers(2)

yourAnswerToTheQuestion