2010-03-08 12 views
66
  1. Auto_ptr sarà deprecato nello standard C++ in entrata?
  2. Dovrebbe essere usato unique_ptr per il trasferimento della proprietà invece di shared_ptr?
  3. Se unique_ptr non è nello standard, allora devo usare invece shared_ptr?

risposta

64

AGGIORNAMENTO: questa risposta è stata scritta nel 2010 e come anticipato std::auto_ptr è stata dichiarata obsoleta. Il consiglio è interamente valido.

In C++ 0x std::auto_ptr sarà deprecato a favore di std::unique_ptr. La scelta del puntatore intelligente dipenderà dal tuo caso d'uso e dalle tue esigenze, con std::unique_ptr con semantica di spostamento per proprietà singola che può essere utilizzata all'interno di container (utilizzando la semantica di spostamento) e std::shared_ptr quando la proprietà è condivisa.

Si dovrebbe provare a utilizzare il puntatore intelligente che si adatta meglio alla situazione, scegliendo il tipo di puntatore corretto fornisce agli altri programmatori una visione approfondita del proprio progetto.

17

Sì, a partire da oggi auto_ptr sarà deprecato in C++ 0x e si dovrebbe usare invece unique_ptr. Dall'ultimo standard di progetto (n3035), sezione D.9

Il modello di classe auto_ptr è obsoleto. [Nota: il modello di classe unique_ptr (20.9.10) offre una soluzione migliore. -end note]

Fino a quando lo standard non sarà ratificato, è sempre possibile che il comitato rivedrà questa decisione, anche se ritengo che sia improbabile per questa decisione.

5

No, non è deprecato. Potrebbe essere, se C++ 0x viene mai accettato. E sarà realisticamente supportato. Non credo che nessuna caratteristica deprecata sia mai stata sganciata da realizzazioni C++ reali.

+0

+1 Per notare che funzioni obsolete vengono mantenute –

+5

serie La C++ è stato aggiornato solo una volta, e che era praticamente una rettifica tecnica (cioè fissati ai problemi che erano stati citati). Non sorprende che non abbia rimosso nulla. OTOH, le vecchie funzionalità finiscono per essere abbandonate dai compilatori. Per esempio, più C++ probabilmente ha usato '' di quanto non sia mai stato usato 'auto_ptr', ma MS VC++ (per uno) non lo fornisce più. –

+1

@Jerry iostream.h non ha mai fatto parte di nessuno standard. E come tale, non è deprecato. –

12

Non solo auto_ptr è deprecato in C++11 (D.10, page 1228), sarà anche eliminatiin a future version of C++:

Adottato N4190, ed effettivamente rimossi (non solo deprecato) parecchie cose arcaici dalla libreria standard C++, tra cui auto_ptr , bind1st/bind2nd, ptr_fun/mem_fun/mem_fun_ref, random_shuffle e alcuni altri. Questi sono ora tutti rimossi dalla bozza della libreria standard C++ 17 e non faranno parte del futuro C++ portatile.

Un altro documento a riguardo: Programming Language C++, Library Evolution Working Group - Document N4190, se si desiderano ulteriori informazioni.

è possibile convertire qualsiasi codice utilizzando auto_ptr automaticamente in base unique_ptr invece:

Qualsiasi codice utilizzando auto_ptr può essere convertita meccanicamente usando unique_ptr, con move() inserita quando auto_ptr veniva "copiato".