Heim > Backend-Entwicklung > C++ > Wie initialisiere ich einen Vektor mit Nur-Verschieben-Typen in C?

Wie initialisiere ich einen Vektor mit Nur-Verschieben-Typen in C?

Patricia Arquette
Freigeben: 2024-12-23 21:31:11
Original
1054 Leute haben es durchsucht

How to Initialize a Vector with Move-Only Types 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))};
Nach dem Login kopieren

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());
Nach dem Login kopieren

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!

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