Od C ++ 11 powinieneś brać to pod względem wartości ponad const i częściej niż myślisz.
Jeśli bierzesz std :: shared_ptr (zamiast bazowego typu T), robisz to, ponieważ chcesz coś z tym zrobić.
Jeśli chcesz go gdzieś skopiować , sensowniej jest zabrać go za pomocą kopiowania i przenieść std :: wewnętrznie, zamiast zabierać to przez const &, a następnie kopiowanie. Jest tak, ponieważ pozwalasz wywołującemu opcję z kolei std :: move shared_ptr podczas wywoływania twojej funkcji, oszczędzając w ten sposób sobie zestaw operacji zwiększania i zmniejszania. Albo nie. Oznacza to, że wywołujący funkcję może zdecydować, czy potrzebuje std :: shared_ptr po wywołaniu funkcji, w zależności od tego, czy się poruszy, czy nie. Nie jest to możliwe, jeśli przejdziesz przez const &, a zatem najlepiej jest przyjąć wartość.
Oczywiście, jeśli osoba wywołująca potrzebuje dłużej swojej shared_ptr (więc nie może std :: move it) i nie chcesz tworzyć zwykłej kopii w funkcji (powiedz, że chcesz słaby wskaźnik, lub tylko czasami chcesz aby go skopiować, w zależności od niektórych warunków), wtedy const i może być nadal preferowane.
Na przykład powinieneś to zrobić
void enqueue(std::shared<T> t) m_internal_queue.enqueue(std::move(t));
nad
void enqueue(std::shared<T> const& t) m_internal_queue.enqueue(t);
Ponieważ w takim przypadku zawsze tworzysz kopię wewnętrznie
shared_ptr
i mogę to zmienić, jeśli chcę.”, Podczas gdy wersja wartościowa mówi „Skopiuję twójshared_ptr
, więc dopóki mogę to zmienić, nigdy się nie dowiesz. ) Parametr const-reference jest prawdziwym rozwiązaniem, które mówi: „Zamierzam trochę pseudonimshared_ptr
i obiecuję, że go nie zmienię.” (Który jest niezwykle podobny do semantyki według wartości!)