2010-03-08 3 views
66
  1. Auto_ptr sera-t-il déconseillé dans le standard C++ entrant?
  2. Devrait-on utiliser unique_ptr pour le transfert de propriété au lieu de shared_ptr?
  3. Si single_ptr n'est pas dans la norme, ai-je besoin d'utiliser shared_ptr à la place?

Répondre

64

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

En C++ 0x std::auto_ptr sera dépréciée en faveur de std::unique_ptr. Le choix du pointeur intelligent dépend de votre cas d'utilisation et de vos besoins, avec std::unique_ptr avec une 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 devriez essayer d'utiliser le pointeur intelligent qui correspond le mieux à la situation, choisir le bon type de pointeur fournit aux autres programmeurs un aperçu de votre conception.

17

Oui, à compter d'aujourd'hui auto_ptr sera obsolète en C++ 0x et vous devrez utiliser unique_ptr à la place. À partir du dernier projet de norme (n3035), section D.9

Le modèle de classe auto_ptr est obsolète. [Note: Le modèle de classe unique_ptr (20.9.10) fournit une meilleure solution. -end note]

Jusqu'à ce que la norme soit ratifiée, il est toujours possible que le comité revoie cette décision bien que je pense que cela soit peu probable pour cette décision.

5

Non, ce n'est pas obsolète. Il se peut que C++ 0x soit accepté. Et il sera réaliste toujours soutenu. Je ne crois pas que toute fonctionnalité obsolète ait jamais été supprimée des implémentations C++ réelles.

+0

+1 pour noter que les fonctionnalités désapprouvées sont retenues –

+5

La norme C de mise à jour n'a été une fois, et qui était fondamentalement juste un rectificatif technique (à savoir fixé à des problèmes qui avaient été cités). Ce n'est pas surprenant que ça n'ait rien enlevé. OTOH, les anciennes fonctionnalités sont finalement abandonnées par les compilateurs. Juste par exemple, plus de C++ a probablement utilisé '' que jamais utilisé 'auto_ptr', mais MS VC++ (pour un) ne le fournit plus. –

+1

@Jerry iostream.h n'a jamais fait partie d'aucune norme. Et en tant que tel, il n'est pas obsolète. –

12

Non seulement auto_ptr est dépréciée in C++11 (D.10, page 1228), il sera également suppriméin a future version of C++:

Adopté N4190, et effectivement retiré (pas seulement désapprouvée) plusieurs choses archaïques de la bibliothèque standard C++, y compris auto_ptr , bind1st/bind2nd, ptr_fun/mem_fun/mem_fun_ref, random_shuffle et quelques autres. Ceux-ci sont maintenant tous supprimés de la bibliothèque standard du projet C++ 17 et ne feront pas partie du futur C++ portable.

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

Vous pouvez convertir tout code à l'aide auto_ptr automatiquement, à l'aide unique_ptr à la place:

Tout code utilisant auto_ptr peut être converti mécaniquement à l'aide inséré unique_ptr, avec move() chaque fois auto_ptr était « copié ».