Desde o C ++ 11, você deve valorizá- lo em const e mais frequentemente do que você imagina.
Se você estiver usando o std :: shared_ptr (em vez do tipo subjacente T), estará fazendo isso porque deseja fazer algo com ele.
Se você deseja copiá-lo em algum lugar, faz mais sentido pegá-lo por cópia e std :: movê-lo internamente, em vez de pegá-lo com const & e depois copiá-lo. Isso ocorre porque você permite ao chamador a opção std :: move o shared_ptr ao chamar sua função, economizando um conjunto de operações de incremento e decremento. Ou não. Ou seja, o chamador da função pode decidir se precisa ou não do std :: shared_ptr depois de chamar a função e dependendo de se mover ou não. Isso não é possível se você passar por const & e, portanto, é preferencialmente aceitá-lo por valor.
Obviamente, se o chamador precisa do seu shared_ptr por mais tempo (portanto, não pode std :: move-lo) e você não deseja criar uma cópia simples na função (digamos que você queira um ponteiro fraco, ou às vezes deseja apenas para copiá-lo, dependendo de alguma condição), então uma const & ainda pode ser preferível.
Por exemplo, você deve fazer
void enqueue(std::shared<T> t) m_internal_queue.enqueue(std::move(t));
sobre
void enqueue(std::shared<T> const& t) m_internal_queue.enqueue(t);
Porque nesse caso, você sempre cria uma cópia internamente
shared_ptr
, e posso alterá-lo, se quiser.", Enquanto a versão de valor diz "Vou copiar o seushared_ptr
, portanto, enquanto posso alterá-lo, você nunca saberá. ) Um parâmetro const-reference é a solução real, que diz "eu vou usar um pseudônimoshared_ptr
e prometo não alterá-lo". (O que é extremamente semelhante à semântica de valor!)