Начиная с C ++ 11, вы должны воспринимать его по значению над const и чаще, чем вы думаете.
Если вы берете std :: shared_ptr (а не базовый тип T), то вы делаете это, потому что хотите что-то с ним сделать.
Если вы хотите скопировать его куда-то, имеет смысл взять его копией и std :: переместить его внутренне, а не копировать с помощью const &, а затем скопировать позже. Это потому, что вы позволяете вызывающей опции в свою очередь вызывать std :: move shared_ptr при вызове вашей функции, тем самым сохраняя себе набор операций увеличения и уменьшения. Или не. То есть, вызывающая функция может решить, нужен ли ему std :: shared_ptr после вызова функции, и в зависимости от того, перемещать или нет. Это не достижимо, если вы проходите мимо const &, и поэтому желательно, чтобы оно принималось по значению.
Конечно, если вызывающей стороне требуется дольше использовать свой shared_ptr (таким образом, он не может std :: переместить его), и вы не хотите создавать обычную копию в функции (скажем, вам нужен слабый указатель, или вы только иногда хотите скопировать его, в зависимости от некоторых условий), тогда const & все еще может быть предпочтительнее.
Например, вы должны сделать
void enqueue(std::shared<T> t) m_internal_queue.enqueue(std::move(t));
над
void enqueue(std::shared<T> const& t) m_internal_queue.enqueue(t);
Потому что в этом случае вы всегда создаете копию внутри
shared_ptr
, и я могу изменить его, если я хочу.», В то время как версия значения говорит: «Я собираюсь скопировать вашshared_ptr
, так что, пока я могу изменить его, вы никогда не узнаете. Параметр const-reference - это реальное решение, которое гласит: «Я собираюсь использовать псевдоним для некоторыхshared_ptr
, и я обещаю не менять его» (что очень похоже на семантику по значению!)