Semantik und Initialisierungsliste verschieben
In C wird eine Initialisierungsliste ist eine temporäre Folge von Werten vom Typ T. Sie wird häufig zum Initialisieren von Arrays und anderen Containern verwendet. Es stellt sich jedoch die Frage: Können Elemente aus einer initializer_list verschoben werden?
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)); // Allowable?
}
}
Nach dem Login kopieren
Antwort:
Leider ist das Verschieben von Elementen aus einer initializer_list wird sich nicht wie beabsichtigt verhalten. Es werden immer noch Kopien erstellt, obwohl erwartet wird, dass initializer_list ein Array von temporären Dateien enthält, bis sie verschoben werden.
Diese Abweichung ergibt sich aus der Tatsache, dass initializer_list::begin() und initializer_list ::end() return const T *. Das Ergebnis der Verschiebung im bereitgestellten Code ergibt eine T-Konstante & &&, die eine unveränderliche R-Wert-Referenz darstellt. Von einem solchen Ausdruck kann nicht abgewichen werden. Es bindet an einen Funktionsparameter vom Typ T const &, da rvalues an const lvalue-Referenzen gebunden werden, was zur Beibehaltung der Kopiersemantik führt.
Der Grund für diese Einschränkung könnte sein, dass der Compiler die initializer_list zu definieren. oder const initializer_list, wodurch die Unklarheit für den Benutzer hinsichtlich der konstanten oder veränderlichen Natur der Ergebnisse von begin() und end() beseitigt wird.
Dennoch wurde eine vorgeschlagene Erweiterung des C-Standards vorgelegt um diese Einschränkung zu beheben und initializer_list um Nur-Verschiebungs-Typen zu unterstützen. Obwohl es sich noch in einem frühen Entwicklungsstadium befindet, empfiehlt es sich, diese Funktion in Zukunft weiter zu erforschen und zu übernehmen.
Das obige ist der detaillierte Inhalt vonKönnen Elemente aus einer C-initializer_list verschoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!