Mi chiedo quale sia la logica alla base del fatto, che std::shared_ptr
non definisce l'operatore []
per gli array. In particolare perché std::unique_ptr
dispone di questo operatore ma non di std::shared_ptr
?Perché non esiste un operatore [] per std :: shared_ptr?
risposta
std::unique_ptr
definisce solo operator[]
in una specializzazione per gli array: std::unique_ptr<T[]>
. Per i puntatori non di matrice, l'operatore [] non ha molto senso comunque (solo [0]
).
Tale specializzazione per std::shared_ptr
manca (in C++ 11), di cui si parla nella relativa domanda: Why isn't there a std::shared_ptr<T[]> specialisation?
Non si deve usare un puntatore intelligente non array con allocazione di array, a meno che non si fornisce un deleter personalizzato In particolare, unique_ptr<int> p = new int[10]
non funziona correttamente, poiché chiama delete
anziché delete[]
. Utilizzare invece unique_ptr<int[]>
, che chiama delete[]
. (E questo implementa operator[]
). Se stai usando shared_ptr
per contenere un T[]
, devi usare un deleter personalizzato. Vedere anche shared_ptr to an array : should it be used? - ma non fornisce operator[]
, poiché utilizza la cancellazione del tipo per distinguere tra array e non-array (il tipo di puntatore intelligente è indipendente dal deleter fornito).
Se vi chiedete perché non v'è alcuna shared_ptr
specializzazione per gli array: quella era una proposta, ma non è stato incluso nella norma (soprattutto a partire dal è possibile aggirare scrivendo ptr.get() + i
per ptr[i]
).
'shared_ptr' usa' delete' _you_ provide (se ne fornisci uno); è abbastanza possibile fornire qualcosa come '[] (T * p) {delete [] p; } '. –
Sì, si tratta principalmente di 'unique_ptr', dal momento che la modifica del deleter per quel puntatore cambia il tipo (nessun tipo cancellato lì). E per 'shared_ptr', abbiamo già una specializzazione che gestisce' delete [] '. – leemes
@JamesKanze Aggiornato, spero sia ora più chiaro ... – leemes
- 1. Perché non esiste un operatore << per std :: unique_ptr?
- 2. Perché non esiste una specializzazione std :: shared_ptr <T[]>?
- 3. Clang, std :: shared_ptr e std :: meno/operatore <
- 4. Perché non c'è un operatore [] per una lista std ::?
- 5. std :: shared_ptr non funziona con intervallo per
- 6. Perché non esiste una specializzazione per std :: shared_ptr <T[]>?
- 7. Perché non esiste un costruttore di riserva per std :: string?
- 8. Perché `std :: initializer_list` non fornisce un operatore di pedici?
- 9. Come gestire l'evoluto C++ std :: namespace? es: std :: tr1 :: shared_ptr vs. std :: shared_ptr vs boost :: shared_ptr vs boost :: tr1 :: shared_ptr
- 10. Perché std :: unique_ptr non ha un costruttore aliasing come std :: shared_ptr ha?
- 11. Posso assegnare 0 a un shared_ptr? Perché?
- 12. Perché questo operatore = chiamata ambigua?
- 13. std :: shared_ptr ed Eredità
- 14. Perché non esiste l'algoritmo std :: copy_if?
- 15. Perché "extern template" non funziona con shared_ptr?
- 16. Doxygen riconosce std :: shared_ptr o std :: map
- 17. Assegnazione ad una variabile membro std :: shared_ptr
- 18. Fusioni 'questo' a std :: shared_ptr
- 19. std :: shared_ptr: reset() vs. assegnazione
- 20. spinta serializzare e std :: shared_ptr
- 21. Passare std :: shared_ptr a Costruttori
- 22. Esiste un caso per un operatore String.IsNullOrEmpty?
- 23. std :: shared_ptr e inizializzazione liste
- 24. Cancellare uno std :: vector richiede un operatore di assegnazione. Perché?
- 25. C++ pointer raw e std :: shared_ptr
- 26. Esiste un operatore OR logico per "ifneq"?
- 27. Devo controllare boost :: shared_ptr o std :: shared_ptr prima di usarlo?
- 28. C++ 11 std :: shared_ptr + boost :: serializzazione
- 29. Perché non esiste un equivalente std :: is_transparent per i contenitori non ordinati?
- 30. Devo std: spostare un shared_ptr in un costruttore di move?
'unique_ptr' ha una specializzazione che gestisce gli array,' shared_ptr' no. 'operator []' viene fornito solo per quella specializzazione. Stai chiedendo perché 'shared_ptr' non ha questo? – juanchopanza
Spero che questo risponda alla tua domanda http://stackoverflow.com/questions/8947579/why-isnt-there-a-stdshared-ptrt-specialisation – Swtsvn
@juanchopanza Suppongo di esserlo. – Haatschii