Перезапись объекта объектом того же типа
Хорошо ли определено следующее?
#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 для указателя тем же, что и присваивание?Переменные-указатели - это просто целые числа с некоторыми операторами или они "мистические"?Пожалуйста, прочитайте эти обсуждения, прежде чем ответить «это смешно».