2015-01-07 13 views
5

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?

+3

'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

+2

Spero che questo risponda alla tua domanda http://stackoverflow.com/questions/8947579/why-isnt-there-a-stdshared-ptrt-specialisation – Swtsvn

+0

@juanchopanza Suppongo di esserlo. – Haatschii

risposta

10

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]).

+2

'shared_ptr' usa' delete' _you_ provide (se ne fornisci uno); è abbastanza possibile fornire qualcosa come '[] (T * p) {delete [] p; } '. –

+0

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

+0

@JamesKanze Aggiornato, spero sia ora più chiaro ... – leemes

Problemi correlati