Heim >Backend-Entwicklung >C++ >Wie initialisiere ich einen Vektor mit Nur-Verschieben-Typen in C?
Initialisierung des Vektors mit Nur-Verschieben-Typ
G versucht, unique_ptr-Objekte bei der Vektorinitialisierung zu kopieren, was aufgrund des Kopierkonstruktors fehlschlägt unzugänglich sein. Die Fehlermeldung weist korrekt auf das Problem des Versuchs hin, nicht kopierbare Objekte zu kopieren.
Verwendung von Move-Iteratoren
Um dieses Problem zu beheben, können Sie Move-Iteratoren nutzen, die verschieben Elemente bei Dereferenzierung:
using move_only = std::unique_ptr<int>; move_only init[] = { move_only(), move_only(), move_only() }; std::vector<move_only> v{std::make_move_iterator(std::begin(init)), std::make_move_iterator(std::end(init))};
Beschäftigung eines Helfers Typ
Alternativ können Sie einen Hilfstyp verwenden, um die Bewegungssemantik bei der Initialisierung zu erreichen:
template<class T> struct rref_wrapper { explicit rref_wrapper(T&& v) : _val(std::move(v)) {} explicit operator T() const { return T{std::move(_val)}; } T&& _val; }; // Only usable on temporaries template<class T> typename std::enable_if< !std::is_lvalue_reference<T>::value, rref_wrapper<T> >::type rref(T&& v) { return rref_wrapper<T>(std::move(v)); } std::initializer_list<rref_wrapper<move_only>> il{rref(move_only()), rref(move_only()), rref(move_only())}; std::vector<move_only> v(il.begin(), il.end());
Das obige ist der detaillierte Inhalt vonWie initialisiere ich einen Vektor mit Nur-Verschieben-Typen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!