In C stellt eine Initialisierungsliste, bezeichnet als std::initializer_list
Im folgenden Codeausschnitt akzeptiert eine Funktion foo eine Initialisierungsliste als Argument:
#include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // Intended to move the element } }
Die Sorge entsteht, weil std::initializer_list
Leider ist die Erwartung einer nahtlosen Elementbewegung unbegründet. Der Versuch, Elemente aus einer Initialisierungsliste zu verschieben, führt zu unerwarteten Ergebnissen. Anstatt die Elemente zu verschieben, werden Kopien erstellt. Dieses Verhalten ist auf die Tatsache zurückzuführen, dass die Anfangs- und Endfunktionen in std::initializer_list
Folglich wird der in bar(std::move(*it)) verwendete Verschiebungsausdruck an einen Funktionsparameter vom Typ T gebunden const &, wodurch die Kopien effektiv erhalten bleiben.
Der Grund für diese Einschränkung wird auf das Vorrecht des Compilers zur Instanziierung zurückgeführt std::initializer_list als statisch initialisierte Konstante. Das Zulassen veränderlicher Ergebnisse von Anfang und Ende würde diese Optimierung behindern und das Design des Compilers komplexer machen.
Trotz des unerwarteten Verhaltens könnte eine Lösung in Sicht sein. Ein [ISO-Vorschlag](https://github.com/CaseyCarter/iso-changes/blob/master/icpp/p1716r4.md) zielt darauf ab, Initialisierungslistenunterstützung für Nur-Verschiebungstypen einzuführen. Diese Bemühungen zielen darauf ab, die Fähigkeiten der Sprache zu verbessern und einen konsistenteren Ansatz für die Arbeit mit Initialisierungslisten und der Verschiebungssemantik bereitzustellen.
Das obige ist der detaillierte Inhalt vonKönnen wir Elemente aus einer „std::initializer_list' in C sicher verschieben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!