initializer_list und Move-Semantik
Der Typ initializer_list in C wird oft verwendet, um Container mit in Klammern eingeschlossenen Wertelisten zu initialisieren. Im Gegensatz zu regulären Containern folgt initializer_list jedoch nicht der Wertesemantik. Infolgedessen stellt sich eine häufige Frage:
Können Elemente aus einem std::initializer_list
Die Antwort auf diese Frage lautet Nein. Der Versuch, dies zu tun, führt zu Kopien, selbst wenn das verschobene Element vom Typ „Nur verschieben“ ist. Dies liegt daran, dass die Funktionen begin() und end() von initializer_list Zeiger auf konstante Werte zurückgeben. Wenn std::move auf einen konstanten Wert angewendet wird, ist das Ergebnis eine unveränderliche R-Wert-Referenz, die nicht sinnvoll verschoben werden kann. Stattdessen wird es an einen Funktionsparameter vom Typ const T& gebunden, was zu einer Kopiersemantik führt.
Dieses Verhalten mag unerwartet erscheinen, da initializer_list eine Liste temporärer Objekte speichern soll. Es wird jedoch davon ausgegangen, dass es eine effizientere statische Initialisierung der Liste ermöglichen würde, den Typ nach Ermessen des Compilers konstant oder veränderbar zu machen.
Aktualisierung: Ein Vorschlag für die initializer_list-Unterstützung von Nur-Verschiebungs-Typen
Als Reaktion auf das Feedback wurde ein ISO-Vorschlag entworfen, um Unterstützung für Nur-Verschiebungs-Typen in initializer_list bereitzustellen. Dieser Vorschlag wird noch geprüft, bietet jedoch eine mögliche Lösung für die aktuellen Einschränkungen von initializer_list bei der Arbeit mit Nur-Verschiebungstypen.
Das obige ist der detaillierte Inhalt vonKönnen Elemente aus einer „std::initializer_list' verschoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!