Desde C ++ 11 deberías tomarlo por valor sobre const y con más frecuencia de lo que piensas.
Si está tomando std :: shared_ptr (en lugar del tipo T subyacente), lo está haciendo porque desea hacer algo con él.
Si desea copiarlo en algún lugar, tiene más sentido tomarlo por copia, y std :: moverlo internamente, en lugar de tomarlo por constante y luego copiarlo. Esto se debe a que le permite a la persona que llama la opción a su vez std :: mover el shared_ptr al llamar a su función, ahorrándose así un conjunto de operaciones de incremento y decremento. O no. Es decir, el llamador de la función puede decidir si necesita o no std :: shared_ptr después de llamar a la función, y dependiendo de si se mueve o no. Esto no se puede lograr si pasa por const &, por lo que es preferible tomarlo por valor.
Por supuesto, si la persona que llama necesita su shared_ptr durante más tiempo (por lo tanto, no puede std :: moverlo) y no desea crear una copia simple en la función (digamos que quiere un puntero débil, o solo a veces quiere copiarlo, dependiendo de alguna condición), entonces una constante y aún podría ser preferible.
Por ejemplo, deberías hacer
void enqueue(std::shared<T> t) m_internal_queue.enqueue(std::move(t));
encima
void enqueue(std::shared<T> const& t) m_internal_queue.enqueue(t);
Porque en este caso siempre creas una copia internamente
shared_ptr
, y puedo cambiarlo si quiero", mientras que la versión de valor dice "Voy a copiar tushared_ptr
, así que mientras pueda cambiarlo, nunca lo sabrás". ) Un parámetro de referencia constante es la solución real, que dice "Voy a alias algunosshared_ptr
, y prometo no cambiarlo" (¡Lo cual es extremadamente similar a la semántica por valor!)