Da P0593 die implizite Erstellung von Objekten für die Objektmanipulation auf niedriger Ebene akzeptiert wurde, können Objekte jetzt implizit in C ++ 20 erstellt werden.
Insbesondere ermöglicht der durch den Vorschlag eingeführte Wortlaut, dass bestimmte Vorgänge (z. B. std::malloc
) automatisch die Lebensdauer von Objekten bestimmter Typen, sogenannte implizite Lebensdauer-Typen , erstellen und starten , wenn die Einführung solcher Objekte dazu führen würde, dass ein Programm mit ansonsten undefiniertem Verhalten vorliegt definiertes Verhalten. Siehe [intro.object] / 10 .
Der Entwurf besagt nun weiter, dass, wenn es mehrere Sätze solcher Objekte gibt, die implizit erstellt werden könnten, um dem Programm ein definiertes Verhalten zu verleihen, nicht angegeben ist, welcher dieser Sätze erstellt wird. (Der relevante Satz scheint in der letzten Überarbeitung des Vorschlags, auf die ich zugreifen konnte, R5, nicht vorhanden zu sein, befindet sich jedoch im Entwurf des Commits.)
Gibt es tatsächlich ein Programm, für das diese Auswahl implizit erstellter Objektmengen beobachtbar ist? Mit anderen Worten, gibt es ein Programm mit definiertem, aber nicht spezifiziertem Verhalten durch diese neue Regel, so dass aus der Ausgabe geschlossen werden kann, welche Arten von impliziten Objekttypen (aus mehr als einem möglichen) erstellt wurden?
Oder sollte dieser Satz lediglich die Programmausführung auf der abstrakten Maschine verdeutlichen (ohne beobachtbare Auswirkungen)?
quelle
std::malloc
) erfolgt, da sonst Probleme mit der Definition auftreten rekursiv abhängig von der Zukunft.Antworten:
Nehmen wir das Beispiel im Standard und ändern es ein wenig:
Bisher gab es nur einen Satz gültiger Objekte, die implizit in diesem Speicher erstellt werden konnten - es musste genau eines sein
X
. Aber jetzt haben wir Speicherplatz für zweiX
Sekunden, schreiben aber nur auf einen von ihnen, und nichts in diesem Programm berührt jemals den Rest der Bytes. Es gibt also viele verschiedene Arten von Objekten, die implizit erstellt werden könnten - vielleicht zweiX
, vielleicht einX
und zweiint
, vielleicht einX
und achtchar
, ...Es ist nicht beobachtbar, welche Menge erstellt wird, denn wenn es tatsächlich Beobachtungen gäbe, würde dies die Möglichkeiten auf nur die Mengen reduzieren, die gültig waren. Wenn wir so etwas gemacht haben,
p[1]->a = 3
dann kollabiert das Universum der Möglichkeiten auf das mit zweiX
s.Mit anderen Worten, mehrere Sätze implizit erstellter Objekte sind möglicherweise nur dann vorhanden, wenn das Programm nicht genügend Beobachtungen enthält, um ihre Gültigkeit zu unterscheiden. Wenn es eine Möglichkeit gäbe, zu unterscheiden, wären sie per Definition nicht alle gültig.
quelle
char
,unsigned char
oderstd::byte
? Dort könnte auch ein Objekt eines trivial kopierbaren Typs existieren, denke ich?X
Objekt zu erstellen .