2015-01-07 10 views
5

Ich frage mich, was die Begründung hinter der Tatsache ist, dass std::shared_ptr den [] Operator für Arrays nicht definiert. Warum hat std::unique_ptr diesen Operator, aber nicht std::shared_ptr?Warum gibt es keinen [] Operator für std :: shared_ptr?

+3

'unique_ptr' hat eine Spezialisierung, die Arrays verwaltet,' shared_ptr' nicht. 'operator []' ist nur für diese Spezialisierung vorgesehen. Fragen Sie, warum 'shared_ptr' das nicht hat? – juanchopanza

+2

Ich hoffe, dies beantwortet Ihre Frage http://stackoverflow.com/questions/8947579/why-isnt-there-a-stdshared-pert-specialization – Swtsvn

+0

@juanchopanza Ich nehme an, ich bin. – Haatschii

Antwort

10

std::unique_ptr definiert nur operator[] in einer Spezialisierung für Arrays: . Für Nicht-Array-Zeiger macht der Operator [] ohnehin keinen Sinn (nur [0]).

Eine solche Spezialisierung für std::shared_ptr fehlt (in C++ 11), die in der entsprechenden Frage diskutiert: Why isn't there a std::shared_ptr<T[]> specialisation?

Sie sollten keine nicht-Array Smart-Pointer mit Array-Zuweisung verwenden, es sei denn, Sie bieten benutzerdefinierter Löschvorgang Insbesondere unique_ptr<int> p = new int[10] ist schlecht, da es delete statt delete[] ruft. Verwenden Sie stattdessen unique_ptr<int[]>, die delete[] aufruft. (Und dieser implementiert operator[]). Wenn Sie shared_ptr verwenden, um eine T[] zu halten, müssen Sie eine benutzerdefinierte Löschung verwenden. Siehe auch shared_ptr to an array : should it be used? - aber es stellt operator[] nicht zur Verfügung, da es Typenlöschung verwendet, um zwischen Array und Nicht-Array zu unterscheiden (der Smart-Zeigertyp ist unabhängig von dem bereitgestellten Deleter).

Wenn Sie sich fragen, warum nicht dort ist shared_ptr Spezialisierung für Arrays: das war ein Vorschlag, wurde aber nicht in den Standard aufgenommen (seit hauptsächlich Sie ptr.get() + i für ptr[i] durch Schreiben umgehen können).

+2

'shared_ptr' verwendet die' delete' _you_-Angabe (wenn Sie eine angeben); es ist durchaus möglich, etwas wie '[] (T * p) {delete [] p; } '. –

+0

Ja, das bezieht sich hauptsächlich auf 'unique_ptr', da das Ändern des Deleters für diesen Zeiger den Typ ändert (kein Typ-Löschen dort). Und für 'shared_ptr' haben wir bereits eine Spezialisierung, die' delete [] 'verarbeitet. – leemes

+0

@JamesKanze Aktualisiert, ich hoffe es ist jetzt klarer ... – leemes