Перезапись объекта объектом того же типа

Хорошо ли определено следующее?

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

Обратите внимание, что после постройки второгоConst, p&nbsp;не семантически (преднамеренно?) указывает на новый объект, а первый ушел, поэтому его можно использовать "какvoid*Msgstr "Но второй объект создается по точно такому же адресу, поэтому битовая комбинацияp&nbsp;представляет адрес нового объекта.

КОММЕНТАРИЙ

new (p) Const(2)&nbsp;стереть старый объект, хранящийся вp, поэтому указатель больше не действителен, кроме как указатель на хранилище (void*).

Я хочу восстановить стоимостьp&nbsp;какConst*.

КОММЕНТАРИЙ 2

После того, какp->~Const()&nbsp;или жеmemset (p, 0, sizeof *p)&nbsp;ясно, чтоp&nbsp;не указывает на действительный объект, поэтомуp&nbsp;может использоваться только как указатель на хранилище (void*&nbsp;или жеchar*), например, для реконструкции другого объекта. В таком случаеp->get0()&nbsp;не допускается.

Здесь снос старого объекта осуществляется конструктором нового, но я не думаю, что это имеет значение.

Моя интуиция такова:В любом случае старый объект исчез, иp&nbsp;указывает на старый объект, а не новый.

Я ищуподтверждение или опровержение&nbsp;на основании стандарта.

СМОТРИТЕ ТАКЖЕ

По сути, я задал один и тот же вопрос об указателях в C и C ++:

Разыменование внешнего указателя, содержащего адрес объекта (массив массива)Является ли memcpy для указателя тем же, что и присваивание?Переменные-указатели - это просто целые числа с некоторыми операторами или они "мистические"?

Пожалуйста, прочитайте эти обсуждения, прежде чем ответить «это смешно».