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
Libérer: 2024-12-23 21:31:11
original
988 Les gens l'ont consulté

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))};
Copier après la connexion

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());
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal