Maison > développement back-end > C++ > Comment lister correctement les vecteurs d'initialisation avec des types à déplacement uniquement en C ?

Comment lister correctement les vecteurs d'initialisation avec des types à déplacement uniquement en C ?

Barbara Streisand
Libérer: 2025-01-01 07:20:10
original
690 Les gens l'ont consulté

How to Correctly List-Initialize Vectors with Move-Only Types in C  ?

initializer_list-Initialisation de vecteurs avec des types de déplacement uniquement

En C , lors de la tentative d'initialisation par liste d'un vecteur avec des éléments d'un déplacement -uniquement, tel que std::unique_ptr, le compilateur peut tenter de manière incorrecte de copier les éléments au lieu de les déplacer. Ce problème peut être résolu à l'aide de diverses techniques :

Wrapper intermédiaire

Pour éviter les copies, un type wrapper peut être utilisé pour conserver les valeurs de déplacement uniquement comme références. La classe rref_wrapper illustre cette approche en encapsulant les valeurs de déplacement uniquement et en fournissant un opérateur pour extraire la valeur sous-jacente. Cela permet de déplacer les valeurs dans le vecteur sans les copier.

Exemple :

std::initializer_list<rref_wrapper<std::unique_ptr<int>>> il{
    rref(std::make_unique<int>()), rref(std::make_unique<int>()),
    rref(std::make_unique<int>())
};
std::vector<std::unique_ptr<int>> v(il.begin(), il.end());
Copier après la connexion

std::make_move_iterator

Une autre méthode consiste à utiliser std::make_move_iterator pour créer des itérateurs qui, une fois déréférencés, déplacent le éléments pointés. Cela élimine le besoin d'une classe wrapper.

Exemple :

std::unique_ptr<int> init[] = { std::make_unique<int>(), std::make_unique<int>(),
                                  std::make_unique<int>() };
std::vector<std::unique_ptr<int>> v{
    std::make_move_iterator(std::begin(init)), std::make_move_iterator(std::end(init))
};
Copier après la connexion

En employant ces techniques, il devient possible d'initialiser des vecteurs avec des types de déplacement uniquement. , garantissant un transfert de propriété efficace et correct.

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