Maison >développement back-end >C++ >Comment initialiser un vecteur avec des types à déplacement uniquement en 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!