Überschreiben eines Objekts mit einem Objekt des gleichen Typs

Ist das Folgende gut definiert?

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

Beachten Sie, dass nach dem Bau des zweitenConst, p zeigt nicht semantisch (absichtlich?) auf ein neues Objekt, und das erste ist weg, also ist es verwendbar "alsvoid* ". Aber das zweite Objekt ist genau an der gleichen Adresse aufgebaut, so dass das Bitmuster vonp stellt die Adresse des neuen Objekts dar.

KOMMENTA

new (p) Const(2) Lösche das alte Objekt, das in @ gespeichert ip, der Zeiger ist also nicht mehr gültig, außer als Zeiger auf Speicher void*).

Ich möchte den Wert von @ wiederherstellp Als einConst*.

COMMENT 2

Nach entwederp->~Const() odermemset (p, 0, sizeof *p) es ist klar, dassp zeigt nicht auf ein gültiges Objekt, alsop kann nur als Zeiger auf den Speicher verwendet werden void* oderchar*), um beispielsweise ein anderes Objekt zu rekonstruieren. An diesem Punktp->get0() ist nicht erlaubt

Hier wird der Abriss des alten Objekts vom Konstrukteur des neuen durchgeführt, aber ich denke nicht, dass das einen Unterschied macht.

Meine Intuition ist, dass: Auf jeden Fall ist das alte Objekt weg undp zeigt auf das alte Objekt, nicht auf das neue.

Ich suche ein Bestätigung oder Widerlegung basierend auf dem Standard.

SIEHE AUC

Ich habe im Wesentlichen die gleiche Frage zu Zeigern in C und C ++ gestellt:

Berechnen eines außerhalb des Bereichs liegenden Zeigers, der die Adresse eines Objekts enthält (Array von Array)Ist die Speicherung eines Zeigers identisch mit der Zuweisung? Sind Zeigervariablen nur Ganzzahlen mit einigen Operatoren oder sind sie "mystisch"?

itte lesen Sie diese Diskussionen, bevor Sie mit "Das ist lächerlich" antworte

Antworten auf die Frage(4)

Ihre Antwort auf die Frage