Heim > Backend-Entwicklung > C++ > Können Elemente aus einer C-initializer_list verschoben werden?

Können Elemente aus einer C-initializer_list verschoben werden?

Barbara Streisand
Freigeben: 2024-12-18 17:14:14
Original
873 Leute haben es durchsucht

Can Elements Be Moved from a C   `initializer_list`?

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage