Parcourir un conteneur de unique_ptr est
Comment peut-on avoir accès unique_ptr éléments d'un conteneur (via un itérateur) sans prendre possession loin de l'conteneur? Lorsque l'on obtient un itérateur sur un élément dans le conteneur est l'élément de propriété encore avec le conteneur? Comment faire lorsque l'on déréférence l'itérateur pour accéder à la unique_ptr? Le fait d'effectuer un implicite déplacer de la unique_ptr?
Je trouve que je suis en utilisant shared_ptr beaucoup quand j'ai besoin de stocker des éléments dans un conteneur (et non par valeur), même si le récipient sur le plan conceptuel possède les éléments et autres code souhaite simplement de manipuler des éléments dans le conteneur, parce que j'ai peur de ne pas pouvoir accéder à la unique_ptr éléments dans le conteneur, sans la propriété d'être de celle-ci.
Des idées?
Vous devez vous connecter pour publier un commentaire.
Tant que vous n'essayez pas de faire une copie de la
unique_ptr
, vous pouvez simplement l'utiliser. Vous aurez à "double déréférencement de l'itérateur pour arriver à la valeur du pointeur, juste que vous auriez avecshared_ptr
. Voici un bref exemple:Si vous n' (accidentellement) faire une copie de la
unique_ptr
:alors vous vous trouvez au moment de la compilation. Il ne sera pas provoquer une erreur d'exécution. Votre cas d'utilisation est pourquoi
container<unique_ptr<T>>
a été construit. Les choses devraient juste travail, et s'ils ne le font pas, le problème apparaît au moment de la compilation au lieu de l'exécution. Donc le code, et si vous ne comprenez pas l'erreur de compilation, puis poser une autre question de revenir ici.for(Container::iterator it = container.begin(); it != container.end(); it++) { unique_ptr<blah>& element = &*it; // No attempted copy? }
Grâce Howard, btw.&
dans votre code. Mais le compilateur va vous dire où.Avec
auto
et la gamme à base de boucles de C++11 cela devient relativement élégant:La référence
&
à lastd::unique_ptr
évite la copie et vous pouvez utiliser leuniqe_ptr
sans déférence.auto &
etauto &&
dans ce cas? Cette référence suggère la double & en.cppreference.com/w/cpp/language/range-for , les deux semblent compilerauto&&
peuvent travailler comme lvalue et rvalue selon l'initialiseur. - Je adapter l'exemple en conséquence.