Heim >Backend-Entwicklung >C++ >Kann ich Elemente aus einer „std::initializer_list' verschieben?

Kann ich Elemente aus einer „std::initializer_list' verschieben?

Linda Hamilton
Linda HamiltonOriginal
2024-12-26 17:02:13674Durchsuche

Can I Move Elements from a `std::initializer_list`?

Kann ich Elemente aus std::initializer_list verschieben?

Bei Verwendung von std::initializer_list ist es logisch zu glauben, dass man Elemente verschieben kann raus daraus. Der folgende Code zeigt jedoch das Gegenteil:

#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));   // Safe?
    }
}

Entgegen den Erwartungen führt der Versuch, Elemente aus std::initializer_list zu verschieben, stattdessen zu Kopien. Dies liegt an der Einzigartigkeit von std::intializer_list, die eine spezielle Compiler-Behandlung erfordert und nicht über die Wertesemantik typischer Container verfügt.

Das Problem liegt im Rückgabetyp von begin() und end() für std ::initializer_list, das ist const T . Daher erzeugt der Ausdruck „std::move(it)“ ​​eine unveränderliche R-Wert-Referenz (T const &&&), die nicht effektiv verschoben werden kann. Es bindet lediglich an einen Funktionsparameter vom Typ T const &, da rvalues ​​an const lvalue-Referenzen gebunden werden, was zu einer Kopiersemantik führt.

Dieses Verhalten mag kontraintuitiv erscheinen, aber es ermöglicht dem Compiler möglicherweise, die initializer_list zu einer statisch- initialisierte Konstante. Dennoch führt es zu einer Inkonsistenz, da der Benutzer unsicher ist, ob das Ergebnis von begin() und end() konstant oder veränderbar ist.

Das obige ist der detaillierte Inhalt vonKann ich 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