Maison >développement back-end >C++ >Comment initialiser un vecteur avec des types à déplacement uniquement en C ?

Comment initialiser un vecteur avec des types à déplacement uniquement en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-23 21:31:11991parcourir

How to Initialize a Vector with Move-Only Types in C  ?

Initialisation du vecteur avec un type de déplacement uniquement

G tente de copier des objets unique_ptr lors de l'initialisation du vecteur, qui échoue en raison du constructeur de copie étant inaccessible. Le message d'erreur met correctement en évidence le problème de la tentative de copie d'objets non copiables.

Utilisation des itérateurs de déplacement

Pour résoudre ce problème, vous pouvez exploiter les itérateurs de déplacement, qui déplacent éléments lorsqu'ils sont déréférencés :

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

Employer un assistant Type

Vous pouvez également utiliser un type d'assistance pour obtenir la sémantique de déplacement lors de l'initialisation :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn