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
Barbara Streisandoriginal
2025-01-01 07:20:10708parcourir

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

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

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!

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