Warum konvertiert std :: unique_ptr nicht implizit in T * und const T *?

8

Wenn ich es selbst schreiben würde, würde ich etwas tun wie:

%Vor%

Und erspare mir die Definition von get() und Operatoren * , -> und [] .

Was ist daran falsch, in diesem Fall implizite Konvertierungen zu haben?

    
PSkocik 15.02.2016, 12:58
quelle

3 Antworten

14

Ich glaube nicht, dass Ihre Frage spezifisch für unique_ptr ist, sondern generell nach intelligenten Zeigern fragt.

Herb Sutter schrieb darüber a vor langer Zeit . Anscheinend würde es Ihnen erlauben, logisch fehlerhaften Code wie:

zu schreiben %Vor%

und anderer Code wie dieser.

    
Ami Tavory 15.02.2016, 13:03
quelle
8

Es gibt einige ärgerliche Fehler, die passieren können, wie andere gezeigt haben, wie

%Vor%

und

%Vor%

Und so weiter. Es ist nur sicherer, wenn man bedenkt, dass diese Sprache für Menschen gedacht ist, um diesen Fallstricken auszuweichen, indem man in solchen Fällen alles explizit macht.

    
Yam Marcovic 15.02.2016 13:20
quelle
6

Ich habe keine formelle Antwort, aber ich habe eine Idee, warum das nicht viel Sinn machen würde. Die ganze Idee von unique_ptr ist eine stark typisierte (d. H. Durch den Compiler erzwungene) Möglichkeit, ein eindeutiges Eigentum an einem Objekt zu tragen. Daher die Umzugs-Semantik.

In diesem Kontext macht es Sinn, dass unique_ptr Sie explizit dazu auffordert, seinen rohen Zeiger anzufordern, denn sobald Sie den rohen Wert haben, können Sie alles leicht brechen: Sie könnten delete it, Sie könnten übergeben Sie es an einen anderen intelligenten Zeiger (der es an einem bestimmten Punkt löschen würde), oder führen Sie Zeigerarithmetik aus und arbeiten Sie versehentlich mit dem Ergebnis (das möglicherweise nicht auf zugewiesenen Speicher verweist) oder ähnlichem. Ein Teil davon kann sofort zu Compiler-Fehlern führen, andere können zu undefiniertem Verhalten führen. Für eine High-Level-Klasse wie unique_ptr ist dies nicht wünschenswert, zumindest nicht implizit. Natürlich können Sie das auch mit .get() tun, aber in diesem Fall wissen Sie , dass Sie den rohen Zeigerwert verwenden und ihn nicht freigeben müssen.

Der Link von Ami ist auch sehr relevant, aber ich denke, ein anderes Beispiel ist besser zitiert:

%Vor%

Die C ++ - Philosophie besagt, dass öffentliche Funktionen , die für einen bestimmten Typ arbeiten können, zu der Schnittstelle dieses Typs gehören. Das Steuern und Beschränken der Schnittstelle eines Typs, der implizit in einen Zeiger umgewandelt wird, ist praktisch unmöglich. Die absichtlich restriktive Art von intelligenten Zeigern würde vollständig dekonstruiert werden, was zu fehleranfälligem Code führen würde.

    
Jonas Wielicki 15.02.2016 13:14
quelle

Tags und Links