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

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

#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 не семантически (преднамеренно?) указывает на новый объект, а первый ушел, поэтому его можно использовать "какvoid*Msgstr "Но второй объект создается по точно такому же адресу, поэтому битовая комбинацияp представляет адрес нового объекта.

КОММЕНТАРИЙ

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

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

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

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

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

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

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

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

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

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

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

Ответы на вопрос(2)

Ваш ответ на вопрос