Bonjour à tous
Je me posais la question de savoir s'il était possible d'utiliser les range-based loop for sur un vecteur d'unique_ptr :
Remarque :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void foo(A const& a) const {} typedef std::vector< std::unique_ptr<A> > V typedef V::const_iterator iterator; V v; // for(auto a : v) // error : le constructeur par copie n'est pas valide // foo(a); for (auto it = v.begin(); it != v.end(); ++it) transform(*it->get()); // ok avec un for normal std::for_each(v.begin(), v.end(), [](iterator it){ foo(*it->get()); } ); // ok avec les lambdas
- v a la responsabilité de la destruction des éléments du vecteurs : unique_ptr
- foo() utilise simplement les éléments du vecteur : référence constante
Si quelqu'un a une idée. Merci
PS : il est possible d'utiliser "auto" dans la fonction lambda à la place de "iterator" ici ?
PS2 : au cas où, gcc 4.6.1 sous Linux 64
PS3 : encore sur l'utilisation de unique_ptr
Quel est le plus sûr en terme de fuite mémoire ? en terme d'écriture ? dans le cas où les traitements ne peuvent pas lancer d'exception ? dans le cas où les traitements peuvent lancer des exception ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 // Version 1 auto a = new A; // traitements sur a v.push_back(std::unique_ptr<A>(a)); m.insert(std::make_pair(k, a)); // m est de type map<K,A*> // Version 2 auto a = std::unique_ptr<A>(new A); // traitements sur m.insert(std::make_pair(k, a.get())); // ok v.push_back(std::move(a)); m.insert(std::make_pair(k, a.get())); // fail...
De plus, a priori, il n'y a pas de fonction make_unique qui serait équivalent à make_shared. Un oubli ? Un choix volontaire ? J'ai besoin de voir un opticien ?
Merci
Partager