Vì C ++ 11, bạn nên lấy nó theo giá trị so với const & thường xuyên hơn bạn nghĩ.
Nếu bạn đang dùng std :: shared_ptr (chứ không phải loại T cơ bản), thì bạn đang làm như vậy vì bạn muốn làm gì đó với nó.
Nếu bạn muốn sao chép nó ở đâu đó, sẽ có ý nghĩa hơn khi lấy nó bằng cách sao chép và std :: di chuyển nó bên trong, thay vì lấy nó bằng const & và sau đó sao chép nó. Điều này là do bạn cho phép người gọi tùy chọn lần lượt std :: di chuyển shared_ptr khi gọi hàm của bạn, do đó tiết kiệm cho mình một tập hợp các hoạt động tăng và giảm. Hay không. Nghĩa là, người gọi hàm có thể quyết định liệu anh ta có cần std :: shared_ptr hay không sau khi gọi hàm, và tùy thuộc vào việc có di chuyển hay không. Điều này là không thể đạt được nếu bạn vượt qua const &, và do đó tốt nhất là lấy nó theo giá trị.
Tất nhiên, nếu cả hai người gọi đều cần shared_ptr của mình lâu hơn (do đó không thể std :: di chuyển nó) và bạn không muốn tạo một bản sao đơn giản trong hàm (giả sử bạn muốn một con trỏ yếu hoặc đôi khi bạn chỉ muốn để sao chép nó, tùy thuộc vào một số điều kiện), sau đó một const & có thể vẫn thích hợp hơn.
Ví dụ, bạn nên làm
void enqueue(std::shared<T> t) m_internal_queue.enqueue(std::move(t));
kết thúc
void enqueue(std::shared<T> const& t) m_internal_queue.enqueue(t);
Bởi vì trong trường hợp này bạn luôn tạo một bản sao trong nội bộ
shared_ptr
và tôi có thể thay đổi nó nếu tôi muốn.", Trong khi phiên bản giá trị nói "Tôi sẽ sao chép của bạnshared_ptr
, vì vậy trong khi tôi có thể thay đổi thì bạn sẽ không bao giờ biết. ) Tham số tham chiếu const là giải pháp thực sự, có nội dung "Tôi sẽ đặt bí danh cho một số ngườishared_ptr
và tôi hứa sẽ không thay đổi nó." (Điều này cực kỳ giống với ngữ nghĩa giá trị!)