Con la llegada del nuevo estándar (y partes ya disponibles en algunos compiladores), std::unique_ptr
se supone que el nuevo tipo es un reemplazo std::auto_ptr
.
¿Su uso se superpone exactamente (por lo que puedo hacer una búsqueda / reemplazo global en mi código (no es que lo haría, pero si lo hiciera)) o debería estar al tanto de algunas diferencias que no son evidentes al leer la documentación?
Además, si es un reemplazo directo, ¿por qué darle un nuevo nombre en lugar de solo mejorarlo std::auto_ptr
?
fuente
std::auto_ptr
ystd::unique_ptr
son incompatibles en algunos aspectos y una caída en el reemplazo en otros. Por lo tanto, no buscar / reemplazar no es lo suficientemente bueno. Sin embargo, después de buscar / reemplazar el trabajo a través de los errores de compilación, debería solucionar todo, excepto los casos extraños de esquina. La mayoría de los errores de compilación requerirán agregar astd::move
.100% compatible, siempre que no lo pase por valor a otra función.
no es 100% compatible, pero 99% compatible no parece incorrecto.
100% compatible con una advertencia,
unique_ptr
s debe pasar a través de unastd::move
llamada. Este es simple ya que el compilador se quejará si no lo hace bien.100% compatible.
esta es complicada.
std::auto_ptr
Las semánticas de copia son malvadas. Si la clase no permite copiar, entoncesstd::unique_ptr
hay una caída en el reemplazo. Sin embargo, si trató de darle a la clase una semántica de copia razonable, deberá cambiar elstd::auto_ptr
código de manejo. Esto es simple ya que el compilador se quejará si no lo hace bien. Si permitiste copiar una clase con unstd::auto_ptr
miembro sin ningún código especial, entonces, qué vergüenza y buena suerte.En resumen,
std::unique_ptr
es un ininterrumpidostd::auto_ptr
. No permite en tiempo de compilación comportamientos que a menudo eran errores al usar astd::auto_ptr
. Entonces, si lo usóstd::auto_ptr
con el cuidado que necesitaba, cambiar astd::unique_ptr
debería ser simple. Si confió enstd::auto_ptr
el comportamiento extraño, entonces necesita refactorizar su código de todos modos.fuente
AFAIK,
unique_ptr
no es un reemplazo directo. El principal defecto que corrige es la transferencia implícita de propiedad.Por otro lado,
unique_ptr
tendrá capacidades completamente nuevas: se pueden almacenar en contenedores.fuente
auto_ptr
no se permiten contenedores de .Herb Sutter tiene una buena explicación sobre GotW # 89 :
En otras palabras, si bien una búsqueda y reemplazo global puede "romper" su código temporalmente, debe hacerlo de todos modos: puede tomar algún tiempo corregir los errores de compilación, pero a la larga le ahorrará muchos más problemas.
fuente