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?
Antwort
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).
'shared_ptr' verwendet die' delete' _you_-Angabe (wenn Sie eine angeben); es ist durchaus möglich, etwas wie '[] (T * p) {delete [] p; } '. –
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
@JamesKanze Aktualisiert, ich hoffe es ist jetzt klarer ... – leemes
'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
Ich hoffe, dies beantwortet Ihre Frage http://stackoverflow.com/questions/8947579/why-isnt-there-a-stdshared-pert-specialization – Swtsvn
@juanchopanza Ich nehme an, ich bin. – Haatschii