Daniel Larusso schrieb:
> ich mache einen Onlinekurs und habe eine Frage,
Grundsätzlich kann man shared_ptr wie einen natürlichen build-in pointer
betrachten: Also den pointer übergeben wenn man die Daten modifizieren
will (share); einen pointer auf den pointer oder eine Referenz wenn man
den pointer selbst ändern möchte (reseat).
Ein shared_ptr ist allerdings kein build-in pointer. Daher sollte man
imho einen shared_ptr nur by-value (wie in share) übergeben wenn die
ownership transferred oder geshared werden soll; ansonsten den build-in
pointer mit get() übergeben.
https://stackoverflow.com/questions/3310737/should-we-pass-a-shared-ptr-by-reference-or-by-value
Grundsätzlich bin ich kein Fan davon Argumente zu modifizieren. Statt
würde ich immer
vorziehen was besser lesbar ist.
Daniel Larusso schrieb:
> Zum reseaten könnte man doch auch machen
> void share(std::shared_ptr<Widget> shaWid)
> ...
So nicht, aber ja, das geht:
1 | shaWid.reset(new Widget());
|
Da könnte für den Aufrufer aber verwirrend sein. Würde ich niemals so
machen.
Daniel Larusso schrieb:
> share(std::shared_ptr<Widget> shaWid):
> I'm for the lifetime of the function body a shared owner of the
> Widget. At the beginning of the function body, I will increase the
> reference counter; at the end of the function, I will decrease the
> reference counter; therefore, the Widget will stay alive, as long as I
> use it.
Das ist richtig; macht hier aber keinen Sinn (solange nicht ein anderer
Thread darauf zugreift) weil die resource ja vom Aufrufer verwaltet wird
und damit eh während des Aufrufs existiert.
> void reseat(std::shared_ptr<Widget>& shaWid): I'm not a shared owner of
> the Widget, because I will not change the reference counter. I have not
> guaranteed that the Widget will stay alive during the execution of my
> function, but I can reseat the resource. A non-const lvalue reference is
> more like: I borrow the resource and can reseat it.
Das ist ebenfalls nicht falsch. Da const nicht verwendet wurde
interpretiere ich solch eine Funktion aber nicht als "borgen und kann
ändern", sondern dass hier die Absicht vorliegt, den Pointer selbst zu
ändern. Weniger verwirrend ist die Form p=f() wie oben geschrieben.