¿Auto_ptr está obsoleto?

82
  1. ¿Auto_ptr quedará obsoleto en el estándar entrante de C ++?
  2. ¿Debería usarse unique_ptr para la transferencia de propiedad en lugar de shared_ptr?
  3. Si unique_ptr no está en el estándar, ¿necesito usar shared_ptr en su lugar?
dimba
fuente

Respuestas:

78

ACTUALIZACIÓN: Esta respuesta se escribió en 2010 y, como se anticipó, std::auto_ptrha quedado obsoleta. El consejo es totalmente válido.

En C ++ 0x std::auto_ptrquedará obsoleto en favor de std::unique_ptr. La elección del puntero inteligente dependerá de su caso de uso y sus requisitos, con std::unique_ptrsemántica de movimiento para propiedad única que se puede usar dentro de contenedores (usando semántica de movimiento) y std::shared_ptrcuando la propiedad es compartida.

Debe intentar utilizar el puntero inteligente que mejor se adapte a la situación; elegir el tipo de puntero correcto proporciona a otros programadores una idea de su diseño.

David Rodríguez - dribeas
fuente
22

Sí, a partir de hoy auto_ptrquedará obsoleto en C ++ 0x y debería usarlo unique_ptren su lugar. Del último borrador de norma (n3035), sección D.9

La plantilla de clase auto_ptrestá obsoleta. [Nota: la plantilla de clase unique_ptr(20.9.10) proporciona una mejor solución. —Nota final]

Hasta que se ratifique el estándar, siempre es posible que el comité revise esta decisión, aunque creo que es poco probable para esta decisión.

R Samuel Klatchko
fuente
17

No solo auto_ptrestá obsoleto en C ++ 11 (D.10, página 1228) , sino que también se eliminará en una versión futura de C ++ :

Adoptado N4190, y en realidad eliminado (no sólo no se use) varias cosas arcaicas de la biblioteca de C ++ estándar, incluyendo auto_ptr, bind1st/ bind2nd, ptr_fun/ mem_fun/ mem_fun_ref, random_shuffley algunos más. Ahora se han eliminado del borrador de la biblioteca estándar de C ++ 17 y no formarán parte del futuro C ++ portátil.

Otro documento al respecto: Lenguaje de programación C ++, Grupo de trabajo de evolución de bibliotecas - Documento N4190 , si desea más información.

Puede convertir cualquier código usando auto_ptrautomáticamente, usando en su unique_ptrlugar:

Cualquier código que se use auto_ptrse puede convertir mecánicamente a usar unique_ptr, move()insertándose siempre que auto_ptrse esté "copiando".

Maxime Lorant
fuente
3

No, no está en desuso. Puede serlo, si alguna vez se acepta C ++ 0x. Y, de manera realista, siempre será compatible. No creo que alguna característica obsoleta se haya eliminado de las implementaciones de C ++ del mundo real.


fuente
5
El estándar C ++ solo se ha actualizado una vez, y eso era básicamente una corrección técnica (es decir, solucionado los problemas que se habían citado). No es sorprendente que no elimine nada. OTOH, las características antiguas eventualmente se eliminan de los compiladores. Solo por ejemplo, probablemente se use más C ++ <iostream.h>que nunca auto_ptr, pero MS VC ++ ( por ejemplo ) ya no lo proporciona.
Jerry Coffin
1
@Jerry iostream.h nunca ha sido parte de ningún estándar. Y como tal, no está desaprobado.
@Neil: No, pero se usó mucho . auto_ptres parte del estándar, pero se usa sustancialmente menos. Desde un punto de vista práctico, su eliminación tendrá un impacto drásticamente menor.
Jerry Coffin
2
@ Jerry bueno, uso mucho auto_ptr y no uso iostream.h en absoluto. A veces pienso que el comité estándar de C ++ tiene algo de abeja en su capó colectivo cuando se trata de desaprobación. Algunas cosas, como las secuencias de cadenas originales obviamente estaban mal, pero a otras les gusta la idea de usar espacios de nombres sin nombre en lugar de la palabra clave "estática" perfectamente utilizable, fueron (y son) completamente locas.
1
@Neil: Bueno, intentemos ponerlo en perspectiva. Independientemente de lo que haga personalmente, considere que una búsqueda en Google de "<iostream.h>" produce ~ 263'000 resultados, y hacer lo mismo con auto_ptr da ~ 66'000 resultados.
Jerry Coffin