Ich habe Schwierigkeiten, den folgenden Absatz zu verstehen, der aus der Referenz über den trivialen Standardkonstruktor zitiert wird . Ich habe nach Stackoverflow gesucht, aber immer noch keine klare Antwort erhalten. Also bitte helfen.
Ein trivialer Standardkonstruktor ist ein Konstruktor, der keine Aktion ausführt. Alle mit der C-Sprache kompatiblen Datentypen (POD-Typen) sind trivial standardmäßig konstruierbar. Im Gegensatz zu C können Objekte mit trivialen Standardkonstruktoren jedoch nicht durch einfaches Neuinterpretieren eines entsprechend ausgerichteten Speichers erstellt werden, z. B. der mit std :: malloc zugewiesene Speicher. Placement-new ist erforderlich, um ein neues Objekt formal einzuführen und potenzielles undefiniertes Verhalten zu vermeiden.
Wenn der triviale Standardkonstruktor nichts tut, warum können wir dann den Speicher nicht neu interpretieren und so tun, als gäbe es ein Objekt mit dem angegebenen Typ? Könnten Sie bitte einige Beispiele für das mögliche undefinierte Verhalten nennen , das dies verursachen würde?
quelle
*reinterpret_cast<float*>(&someNonFloatObject) = 0.1f;
. C ++ hat ein Konzept von Objekten und Objektlebensdauern, das auf dem abstrakten Computer angegeben ist. Nur weil es keine CPU-Anweisung zum Erstellen eines Objekts aus dem Speicher gibt, bedeutet dies nicht, dass es auf dem abstrakten Computer keinen Unterschied gibt.Antworten:
P0593R5 gibt dieses Beispiel:
und erklärt:
In der Praxis funktioniert dies und die UB-Situation wird mehr als ein Defekt in der Norm als alles andere angesehen. Das gesamte Ziel des Papiers ist es, einen Weg vorzuschlagen, um dieses Problem und ähnliche Fälle zu beheben, ohne andere Dinge zu beschädigen.
quelle
Aus "Reinheitsgründen".
Die Alternative und der tatsächliche Status Quo bestand darin, dass jeder Speicherbereich alle Objekte enthält, die gleichzeitig in diesen Speicher passen. Einige Ausschussmitglieder sind unruhig mit dem Status quo und eine Menge Leute fürchteten den Begriff der mit unendlich viele Objekte an der gleichen Stelle (in einem virtuellen, nicht initialisierten Zustand).
Niemand hat jemals ein logisches Problem mit unendlich vielen Objekten in einer Speicherregion aufzeigen können.
Da es in verschiedenen Abschnitten des Standards widersprüchliche Aussagen gab, beschlossen die Ausschussmitglieder, einen der schlimmsten Teile des Standards ernst zu nehmen.
Die Verwendung von String-Literalen ist strengstens untersagt, wenn Sie diesen einen Teil des Standards wirklich ernst nehmen.
quelle
type_info
Objekten. Haben Sie über String-Literale berichtet?