2010-03-08 17 views
66
  1. ¿Auto_ptr quedará obsoleto en el estándar entrante de C++?
  2. ¿Debería unique_ptr utilizarse 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?

Respuesta

64

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

En C++ 0x std::auto_ptr se desaprobará en favor de std::unique_ptr. La elección del puntero inteligente dependerá de su caso de uso y sus requisitos, con std::unique_ptr con semántica de movimiento para propiedad individual que se puede usar dentro de contenedores (usando la semántica de movimiento) y std::shared_ptr cuando se comparte la propiedad.

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.

17

Sí, a partir de hoy auto_ptr quedarán obsoletos en C++ 0x y en su lugar debería usar unique_ptr. Desde el último borrador de estándar (n3035), sección D.9

La plantilla de clase auto_ptr está obsoleta. [Nota: la plantilla de clase unique_ptr (20.9.10) proporciona una mejor solución. -finalizar]

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.

5

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

+0

1 para señalar que Características en desuso se retienen –

+5

estándar El C++ sólo se ha actualizado una vez, y que era básicamente sólo una corrección de errores técnica (es decir, fijado a problemas que habían sido citados). No es sorprendente que no haya eliminado nada. OTOH, las características antiguas finalmente se eliminan de los compiladores. Solo por ejemplo, más C++ probablemente usó '' que nunca antes utilizado 'auto_ptr', pero MS VC++ (para uno) ya no lo proporciona. –

+1

@Jerry iostream.h nunca ha sido parte de ningún estándar. Y como tal, no está en desuso. –

12

No sólo auto_ptr es obsoleto in C++11 (D.10, page 1228), también será suprimenin a future version of 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_shuffle, y algunos más. Esos ahora son eliminados del borrador de la biblioteca estándar de C++ 17 y no serán parte del futuro C++ portátil.

Otro documento al respecto: Programming Language C++, Library Evolution Working Group - Document N4190, si desea más información.

puede convertir cualquier código usando auto_ptr de forma automática, mediante el uso de unique_ptr lugar:

Cualquier código usando auto_ptr se puede convertir mecánicamente usando unique_ptr, con move() insertada cada vez auto_ptr estaba siendo "copiado".