Aus dem gleichen Grund ein T*const
bei Dereferenzierung ist ein T&
, kein T const&
.
Konstanz des Zeigers unterscheidet sich von Pointness von pointed-to .
get
konstant ist, ändert es den Zustand nicht von unique_ptr
.
Seine Beständigkeit hat keinen Einfluss auf die Beständigkeit des Inhalts.
Es gibt die Idee von intelligenten Zeigern, die Konstanz propagieren, aber unique_ptr
ist nicht das Biest.
std::experimental::propogate_const
umschließt ein zeigerähnliches Objekt und macht const
reise hindurch.
Es oder etwas Ähnliches kann Ihr Problem lösen.
Beachten Sie, dass ich die Hälfte der Zeit finde, wenn ich versuche, const so zu verbreiten, dass ich feststelle, dass ich mich geirrt habe. Dies ist hier jedoch möglicherweise nicht der Fall.
Im Allgemeinen die richtige Art, mit den Eingeweiden einer T*const
umzugehen in einem const
Weise ist, einen T const&
zu übergeben (oder die Nullable-Variante T const*
).
Intelligente Zeiger geben vor, ein Rohzeiger zu sein. Wenn Sie ein Klassenmitglied haben, das ein Rohzeiger ist, und es in const
verwenden Methode, dass Sie einen Zeiger nicht aktualisieren können, aber Sie können ein Objekt ändern, auf das gezeigt wird. Dasselbe Verhalten ist für intelligente Zeiger erwünscht. Also std::unique_ptr::get
ist ein const
-Methode, erzwingt aber nicht die Rückgabe des Zeigers auf const
Objekt.
Beachten Sie auch, dass Sie einen Zeiger auf const
haben können Objekt.
MyClass *pointerToObject
std::unique_ptr<MyClass> smartPointerToObject;
// but you can have also a case
const MyClass *pointerToConstObject
std::unique_ptr<const MyClass> smartPointerToConstObject;
Im letzten Fall std::unique_ptr::get
wird etwas zurückgeben, das Sie erwarten.
Basierend auf dem Kommentar unten:
Geben Sie einfach private Methoden an:
InnerClass& GetField() { return *uniquePtrToInnerClass; }
const InnerClass& GetField() const { return *uniquePtrToInnerClass; }
Und verwenden Sie es in Ihrem Code und Sie haben ein konstantes Objekt der inneren Klasse in der konstanten Methode.
Es hat keinen Sinn, einem Objekt über seinen unique_ptr
nur Lesezugriff zu gewähren . Sie passieren nur unique_ptr
Wenn Sie die Eigentümerschaft übertragen, rufen Sie für den Zugriff auf das Objekt ohne Eigentumsübertragung up.get()
auf und übergeben Sie einen const T*
zu der Funktion, die nur lesen soll (oder wenn der Zeiger nie nullptr
ist , ist es auch sinnvoll, *(up.get())
auszuwerten und übergeben Sie einen const T&
).
Als Bonus können Sie diese Funktion mit Objekten verwenden, die auf dem Stapel gespeichert, in ein anderes Objekt eingebettet oder mit einem anderen intelligenten Zeiger als unique_ptr
verwaltet werden .
Hier finden Sie eine gute Diskussion aller Fälle der Übergabe von unique_ptr-Parametern (in/out, const/non-const usw.):
- Wie übergebe ich einen
unique_ptr
Argument für einen Konstruktor oder eine Funktion?