Initialisierungslisten und Verschiebungssemantik: Kann ich Elemente herausziehen?
Es stellt sich eine Frage bezüglich der Verwendung von Initialisierungslisten und Verschiebungssemantik: ist Ist es zulässig, Elemente aus einer std::initializer_list
Das Problem
Bedenken Sie den folgenden Codeausschnitt:
#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)); // kosher? } }
Hier möchten wir prüfen, ob dies möglich ist Elemente aus einer std::initializer_list verschieben.
Die Antwort
Überraschenderweise lautet die Antwort nein. Der Ausdruck std::move(*it) führt nicht zu einer Verschiebung. Stattdessen wird eine unveränderliche R-Wert-Referenz vom Typ T const && erzeugt. Dies liegt daran, dass die begin- und end-Methoden von initializer_list const T * zurückgeben, was keine Verschiebungssemantik zulässt.
Der wahrscheinliche Grund dafür ist, dass der Compiler initializer_list als statisch initialisierte Konstante erstellen kann. Es wäre jedoch intuitiver, wenn begin und end je nach Ermessen des Compilers entweder initializer_list oder const initializer_list zurückgeben würden.
Weitere Überlegungen
Es wurde ein ISO-Vorschlag gemacht wurde erstellt, um initializer_list-Unterstützung für Nur-Verschiebungstypen bereitzustellen. Obwohl sich dieser Vorschlag noch in einem frühen Stadium befindet, geht er das hier angesprochene Problem an.
Das obige ist der detaillierte Inhalt vonKönnen Sie Elemente aus einer std::initializer_list verschieben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!