Karena C ++ 11 Anda harus mengambilnya dengan nilai lebih dari const & lebih sering daripada yang Anda pikirkan.
Jika Anda menggunakan std :: shared_ptr (daripada tipe T yang mendasarinya), maka Anda melakukannya karena Anda ingin melakukan sesuatu dengannya.
Jika Anda ingin menyalinnya suatu tempat, lebih masuk akal untuk mengambilnya dengan menyalin, dan std :: memindahkannya secara internal, daripada mengambilnya dengan const & dan kemudian menyalinnya. Ini karena Anda membiarkan opsi penelepon pada gilirannya std :: memindahkan shared_ptr saat memanggil fungsi Anda, sehingga menghemat sendiri satu set operasi kenaikan dan penurunan. Atau tidak. Artinya, pemanggil fungsi dapat memutuskan apakah dia memerlukan std :: shared_ptr di sekitar setelah memanggil fungsi, dan tergantung pada apakah atau tidak bergerak atau tidak. Ini tidak dapat dicapai jika Anda melewati const &, dan karena itu lebih disukai untuk mengambilnya dengan nilai.
Tentu saja, jika pemanggil keduanya membutuhkan shared_ptr-nya lebih lama (sehingga tidak dapat std :: memindahkannya) dan Anda tidak ingin membuat salinan polos dalam fungsi (misalkan Anda ingin penunjuk yang lemah, atau Anda hanya kadang-kadang ingin untuk menyalinnya, tergantung pada beberapa kondisi), maka konst & mungkin masih lebih disukai.
Misalnya, Anda harus melakukannya
void enqueue(std::shared<T> t) m_internal_queue.enqueue(std::move(t));
lebih
void enqueue(std::shared<T> const& t) m_internal_queue.enqueue(t);
Karena dalam hal ini Anda selalu membuat salinan secara internal
shared_ptr
, dan saya bisa mengubahnya jika saya mau.", Sementara versi nilai mengatakan "Saya akan menyalin Andashared_ptr
, jadi sementara saya bisa mengubahnya, Anda tidak akan pernah tahu. ) Parameter const-reference adalah solusi nyata, yang mengatakan "Saya akan alias beberapashared_ptr
, dan saya berjanji untuk tidak mengubahnya." (Yang sangat mirip dengan nilai-semantik!)