Bedenken Sie:Ist Zugriff auf ein Mitglied einer Struktur in seinem eigenen initializer undefiniertes Verhalten
struct A { void do_something() {} };
struct B {
A& a;
B(A& a) : a{a} { a.do_something(); }
};
struct C {
A a; B b;
C(A& a) : b{a} {}
};
int main() {
C c{ c.a };
}
Es scheint möglich, dass diese könnte zur Arbeit gemacht werden, denn:
- noch vor
c
ist initialisiert, wir kennen sein Speicherlayout und die Adressec.a
- wir nicht tatsächlich verwenden
c.a
bis es initialisiert ist.
Zusätzlich habe ich unter ein paar verschiedenen Compilern keine Warnung erhalten.
Allerdings hatte ich ein extrem merkwürdiges Verhalten (etwas später), das nur darauf zurückzuführen war, etwas Undefiniertes zu tun, und das ging nur weg, wenn ich mein Programm neu organisierte, um dieses Muster zu vermeiden.
Danke.
Zugriff 'c.a' * außerhalb 'C' Konstruktor * und vor 'c' Lebzeiten ein Problem begonnen hat. Es ist ein bisschen wie 'int x = x;'. –
Aber mein Programm funktioniert perfekt! – STU
@STU, undefiniertes Verhalten bedeutet nicht, dass der Code nicht funktionieren würde, (und Ihr derzeitiges Snippet funktioniert gut und sollte für jeden vernünftigen Compiler gut funktionieren). Aber UB bedeutet auch, dass der Compiler Code erzeugen darf, der das wird formatiere deinen PC neu; ;-) – WhiZTiM