Оскільки C ++ 11, ви повинні приймати його за значенням над const & частіше, ніж ви можете подумати.
Якщо ви приймаєте std :: shared_ptr (а не основний тип T), ви робите це, тому що хочете щось з ним зробити.
Якщо ви хочете скопіювати його кудись, має сенс взяти його копією, а std :: перемістити всередину, а не брати його const &, а потім скопіювати. Це тому, що ви дозволяєте абоненту можливість по черзі std :: переміщувати 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-референс - це справжнє рішення, яке говорить: "Я збираюся псевдоніми деякіshared_ptr
, і я обіцяю не змінювати його" (що надзвичайно схоже на семантику за значенням!)