std::auto_ptr à std::unique_ptr
Avec la nouvelle norme à venir (et les pièces déjà disponibles dans certains compilateurs), le nouveau type std::unique_ptr
est censé être un remplacement pour std::auto_ptr
.
Ne leur utilisation exactement chevauchement (afin que je puisse faire une recherche/remplacement global sur mon code (pas que je le ferai, mais si je l'ai fait)) ou dois-je être au courant de certaines des différences qui ne sont pas apparents à la lecture de la documentation?
Aussi si c'est un remplacement direct, pourquoi lui donner un nouveau nom, plutôt que de simplement d'améliorer la std::auto_ptr
?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas faire une recherche/remplacement global parce que vous pouvez copier un
auto_ptr
(avec des conséquences connues), mais ununique_ptr
ne peut être déplacé. Tout ce qui ressemble dedevra être au moins comme ça
Comme pour les autres différences,
unique_ptr
peut gérer des tableaux correctement (il va appelerdelete[]
, tandis queauto_ptr
essaie d'appelerdelete
.std::auto_ptr
etstd::unique_ptr
sont incompatibles dans someways et une baisse de remplacement dans d'autres. Donc, pas de fonction rechercher/remplacer n'est pas assez bon. Cependant, après un rechercher/remplacer de travail à travers les erreurs de compilation doit tout régler à l'exception étrange cas du coin. La plupart des erreurs de compilation nécessitent l'ajout d'unstd::move
.100% compatible, tant que vous ne passez pas par valeur à une autre fonction.
pas 100% compatible, mais 99% compatible ne semble pas mal.
100% compatible avec une mise en garde,
unique_ptr
s doit être passé à travers unstd::move
appel. C'est simple comme le compilateur va se plaindre si vous n'avez pas l'obtenir.100% compatible.
Celui-ci est difficile.
std::auto_ptr
s sémantique de copie sont le mal. Si la classe n'autorise pas la copie puisstd::unique_ptr
est une baisse de remplacement. Toutefois, si vous avez essayé de donner à la classe raisonnable sémantique de copie, vous aurez besoin de changer lastd::auto_ptr
le code de traitement. C'est simple comme le compilateur va se plaindre si vous n'avez pas l'obtenir. Si vous avez autorisé la copie d'une classe avec unstd::auto_ptr
membre sans aucun code particulier, alors honte à vous et bonne chance.En résumé,
std::unique_ptr
est ininterrompuestd::auto_ptr
. Il interdit au moment de la compilation des comportements qui ont été souvent erreurs lors de l'utilisation d'unstd::auto_ptr
. Donc, si vous avez utiliséstd::auto_ptr
avec les soins dont il a besoin, le passage àstd::unique_ptr
devrait être simple. Si vous comptiez surstd::auto_ptr
's un comportement étrange, alors vous avez besoin de restructurer le code de toute façon.Autant que je sache,
unique_ptr
n'est pas un remplacement direct. Le principal défaut qu'il fixe est l'implicite de transfert de propriété.D'autre part,
unique_ptr
aura complètement nouvelles capacités: ils peuvent être stockés dans des conteneurs.auto_ptr
ne sont pas autorisés.Herb Sutter a une belle explication sur GotW #89:
En d'autres termes, si un mondial de la recherche et de remplacement peut "casser" votre code temporairement, vous devriez faire de toute façon: Il peut prendre un certain temps pour corriger les erreurs de compilation, mais vous permettra d'économiser que vous beaucoup plus de mal dans le long terme.