Zunächst lassen Sie mich eine Sache klären. Ich bin mir nicht sicher, ob es sogar möglich ist, wörtlich eine Referenz zu kopieren.
int i = 10;
int& ref = i; // since this moment ref becomes "untouchable"
int& alt_ref = ref; // actually, means int& alt_ref = i;
denke ich, das gleiche passiert, wenn ref
ein Mitglied einer Klasse ist und Sie eine Instanz dieser Klasse kopieren. Außerdem, wenn Sie näher auf Ihren Code schauen, Sie nicht einmal "eine Referenz kopieren", sondern eine Referenz mit nicht initialisierten (noch) Objekt initialisieren.
struct Parent
{
Object& ref;
Parent(Object& i): ref(i) { }
};
struct Child : Parent
{
Object obj;
Child(int i): Parent(obj), obj(i) { }
};
ist physikalisch äquivalent zu:
struct Child
{
Object& ref;
Object obj;
Child(int i): ref(obj), obj(i) { }
};
Mit diesem wird gesagt, Ihre Frage eigentlich bedeutet:
Ist es nicht definiertes Verhalten zu eine Referenz vor initialisieren das Objekt initialisiert es ist etwa verweisen?
Hier ein Zitat von C++ Norm (§3.8.6 [basic.life/6]), die gibt möglicherweise die Antwort:
In ähnlicher Weise, bevor die Lebensdauer eines Objekts begonnen hat, aber nach Der Speicher, den das Objekt belegen soll, wurde zugewiesen, oder nach der Lebensdauer eines Objekts und vor der Speicherung des Objekts, das belegt oder freigegeben ist, darf nur ein glvalue verwendet werden, der sich auf das Originalobjekt bezieht in begrenzten Möglichkeiten. Für ein Objekt im Bau oder Zerstörung, siehe 12.7. Andernfalls bezieht sich ein solcher glvalue auf zugewiesenen Speicher (3.7.4.2), und die Verwendung der Eigenschaften des glvalue, die nicht von seinem Wert abhängen, ist wohldefiniert.
Und §12.7.1 [class.cdtor/1] sagt nur:
... mit Bezug auf jede nicht-statisches Element oder Basisklasse des Objekts vor dem Konstruktor beginnt Ergebnisse Ausführung in undefiniertem Verhalten.
§12.7.1 nur erwähnt „die sich auf Objekte Mitglieder“, also „auf das Objekt verweisen selbst“ fallen unter §3.8.6. Auf diese Weise kann ich feststellen, dass die Bezugnahme auf nicht initialisiertes (aber bereits zugewiesenes) Objekt wohldefiniert ist.
Wenn Sie irgendwelche Fehler sehen, lassen Sie mich bitte in den Kommentaren wissen. Fühlen Sie sich auch frei, diese Antwort zu bearbeiten.
Edit: Ich möchte nur sagen, dass eine solche Schlussfolgerung vernünftig scheint. Die Initialisierung eines Objekts kann seinen Speicherort im Speicher nicht ändern. Was ist schlecht beim Speichern der Referenz auf bereits zugewiesenen Speicher noch vor der Initialisierung?
Sie haben keinen nicht initialisierten Verweis, sondern einen Verweis auf ein nicht initialisiertes Objekt. Das unterscheidet sich von dem, was Sie aus dem Standard zitieren, und der Code ist in Ordnung, solange 'Eltern' die Referenz nicht verwendet, bis alles initialisiert ist. –
Danke, ich habe den Titel aktualisiert, um Ihre Bemerkung zu reflektieren. Was Sie sagen, ist sinnvoll, da es sich um einen Zeiger auf ein nicht initialisiertes Objekt handelt. – Flynsee
Hat also Bos Kommentar deine Frage beantwortet? Oder haben Sie bearbeitet, um einen Unterschied in Ihrer Frage zu klären? – Yunnosch