web-dev-qa-db-fra.com

Auto_ptr est-il déconseillé?

  1. Auto_ptr sera-t-il déconseillé dans la norme C++ entrante?
  2. Doit-on utiliser unique_ptr pour le transfert de propriété au lieu de shared_ptr?
  3. Si unique_ptr n'est pas dans la norme, dois-je utiliser à la place shared_ptr?
76
dimba

MISE À JOUR: Cette réponse a été écrite en 2010 et comme prévu std::auto_ptr est obsolète. Le conseil est entièrement valable.

En C++ 0x std::auto_ptr sera déconseillé au profit de std::unique_ptr. Le choix du pointeur intelligent dépendra de votre cas d'utilisation et de vos besoins, avec std::unique_ptr avec la sémantique de déplacement pour une propriété unique qui peut être utilisée à l'intérieur des conteneurs (en utilisant la sémantique de déplacement) et std::shared_ptr lorsque la propriété est partagée.

Vous devez essayer d'utiliser le pointeur intelligent qui correspond le mieux à la situation, le choix du type de pointeur correct fournit aux autres programmeurs un aperçu de votre conception.

Oui, à partir d'aujourd'hui auto_ptr sera déconseillé en C++ 0x et vous devez utiliser unique_ptr au lieu. D'après le dernier projet de norme (n3035), section D.9

Le modèle de classe auto_ptr est obsolète. [Remarque: le modèle de classe unique_ptr (20.9.10) fournit une meilleure solution. —Fin note]

Jusqu'à ce que la norme soit ratifiée, il est toujours possible que le comité révise cette décision, même si je pense que c'est peu probable pour cette décision.

20

Non seulement auto_ptr Est déconseillé en C++ 11 (D.10, page 1228) , il sera également suppriméen une future version de C++ :

Adopté N4190 et supprimé (pas seulement obsolète) plusieurs éléments archaïques de la bibliothèque standard C++, notamment auto_ptr, bind1st/bind2nd, ptr_fun/mem_fun/mem_fun_ref, random_shuffle, Et quelques autres. Ceux-ci sont maintenant tous supprimés du projet de bibliothèque standard C++ 17 et ne feront pas partie du futur C++ portable.

Un autre document à ce sujet: Programming Language C++, Library Evolution Working Group - Document N419 , si vous voulez plus d'informations.

Vous pouvez convertir n'importe quel code en utilisant auto_ptr Automatiquement, en utilisant unique_ptr À la place:

Tout code utilisant auto_ptr Peut être mécaniquement converti en utilisant unique_ptr, Avec move() inséré chaque fois que auto_ptr Était "copié".

15
Maxime Lorant

Non, ce n'est pas obsolète. C'est possible, si jamais C++ 0x est accepté. Et il sera réaliste toujours toujours pris en charge. Je ne pense pas qu'une fonctionnalité obsolète ait été supprimée des implémentations C++ réelles.

4
anon