Estoy confundido con la filosofía unique_ptr y rvalue move.¿Se puede usar unique_ptr de forma segura en las colecciones stl?
Digamos que tenemos dos colecciones:
std::vector<std::auto_ptr<int>> autoCollection;
std::vector<std::unique_ptr<int>> uniqueCollection;
Ahora que se puede esperar el siguiente al fracaso, ya que no se sabe lo que el algoritmo está haciendo internamente y tal vez la realización de copias de articulación interna y similares, arrancando por lo tanto propiedad de distancia de auto_ptr:
std::sort(autoCollection.begin(), autoCollection.end());
Entiendo esto. Y el compilador con razón no permite que esto suceda.
Pero entonces hacer esto:
std::sort(uniqueCollection.begin(), uniqueCollection.end());
Y esto compila. Y no entiendo por qué. No creo que se puedan copiar unique_ptrs. ¿Esto significa que no se puede tomar un valor de pivote, por lo que el tipo es menos eficiente? ¿O es este pivote en realidad un movimiento, que de hecho es tan peligroso como la colección de auto_ptrs, y el compilador no debería permitirlo?
Creo que me falta algo crucial de información, así que espero ansiosamente que alguien me proporcione el aha! momento.
En realidad, el compilador * debería * quejarse de 'std :: vector> autoCollection;' porque los COAPS (Contenedores de punteros automáticos) no están permitidos en ninguna descripción. –
Usando VS2010. Ni siquiera recibo una advertencia en/W4. – DanDan
u obtén una advertencia de que auto_ptr está depreciado. – DanDan