Seit C ++ 11 sollten Sie es öfter als gedacht als Wert über const & nehmen .
Wenn Sie std :: shared_ptr (anstelle des zugrunde liegenden Typs T) verwenden, tun Sie dies, weil Sie etwas damit tun möchten.
Wenn Sie es irgendwo kopieren möchten , ist es sinnvoller, es per Kopie zu nehmen und std :: intern zu verschieben, als es durch const & zu nehmen und später zu kopieren. Dies liegt daran, dass Sie dem Aufrufer die Möglichkeit geben, beim Aufrufen Ihrer Funktion wiederum std :: move_ptr zu verschieben, wodurch Sie sich eine Reihe von Inkrementierungs- und Dekrementierungsoperationen ersparen. Oder nicht. Das heißt, der Aufrufer der Funktion kann entscheiden, ob er nach dem Aufrufen der Funktion std :: shared_ptr benötigt oder nicht, und abhängig davon, ob er sich bewegt oder nicht. Dies ist nicht erreichbar, wenn Sie an const & vorbeikommen, und daher ist es dann vorzugsweise, es als Wert zu nehmen.
Natürlich, wenn der Aufrufer sein shared_ptr länger benötigt (kann es also nicht std :: move) und Sie keine einfache Kopie in der Funktion erstellen möchten (sagen Sie, Sie möchten einen schwachen Zeiger oder Sie möchten nur manchmal um es zu kopieren, abhängig von einer Bedingung), dann ist ein const & möglicherweise immer noch vorzuziehen.
Zum Beispiel sollten Sie tun
void enqueue(std::shared<T> t) m_internal_queue.enqueue(std::move(t));
Über
void enqueue(std::shared<T> const& t) m_internal_queue.enqueue(t);
Denn in diesem Fall erstellen Sie immer intern eine Kopie
shared_ptr
und ich kann es ändern, wenn ich will.", Während die Wertversion sagt: "Ich werde Ihre kopierenshared_ptr
, also werden Sie es nie erfahren, solange ich sie ändern kann." ) Ein const-reference-Parameter ist die eigentliche Lösung, die besagt: "Ich werde einigeshared_ptr