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!