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
Patricia ArquetteOriginal
2024-12-23 21:31:11993Durchsuche

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))};

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!

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