Heim >Backend-Entwicklung >C++ >Können Sie Elemente aus einer std::initializer_list verschieben?

Können Sie Elemente aus einer std::initializer_list verschieben?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-26 00:49:09962Durchsuche

Can You Move Elements Out of a std::initializer_list?

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 zu verschieben? Lassen Sie uns das weiter untersuchen.

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!

Stellungnahme:
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