ตั้งแต่ C ++ 11 คุณควรรับมันด้วยค่าที่มากกว่า &บ่อยกว่าที่คุณคิด
หากคุณกำลังใช้ std :: shared_ptr (แทนที่จะเป็นประเภท T พื้นฐาน) แสดงว่าคุณกำลังทำเช่นนั้นเพราะคุณต้องการทำอะไรกับมัน
หากคุณต้องการคัดลอกไปที่ไหนสักแห่งมันเหมาะสมกว่าที่จะคัดลอกและ std :: ย้ายมันภายในแทนที่จะใช้มันโดย const & แล้วคัดลอกในภายหลัง นี่เป็นเพราะคุณอนุญาตให้ผู้เรียกใช้ตัวเลือกในการเปิด std :: ย้าย shared_ptr เมื่อเรียกใช้งานฟังก์ชั่นของคุณดังนั้นการบันทึกชุดของการดำเนินการที่เพิ่มขึ้นและลดลง หรือไม่. นั่นคือผู้โทรของฟังก์ชั่นสามารถตัดสินใจได้ว่าเขาต้องการ std :: shared_ptr รอบ ๆ หลังจากเรียกใช้ฟังก์ชันหรือไม่และขึ้นอยู่กับว่าจะย้ายหรือไม่ สิ่งนี้จะไม่สามารถทำได้ถ้าคุณผ่านเครื่องหมาย & & ดังนั้นจึงควรใช้ค่านี้
แน่นอนถ้าผู้เรียกทั้งสองต้องการ shared_ptr ของเขารอบนานกว่า (ดังนั้นไม่สามารถ std :: ย้าย) และคุณไม่ต้องการสร้างสำเนาธรรมดาในฟังก์ชั่น (พูดว่าคุณต้องการตัวชี้อ่อนแอหรือบางครั้งคุณต้องการเท่านั้น เพื่อคัดลอกมันขึ้นอยู่กับเงื่อนไขบางอย่าง) จากนั้นกลุ่ม & อาจจะยังดีกว่า
ตัวอย่างเช่นคุณควรทำ
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-reference คือทางออกที่แท้จริงซึ่งบอกว่า "ฉันจะใช้นามแฝงบางอย่างshared_ptr
และฉันสัญญาว่าจะไม่เปลี่ยนแปลง" (ซึ่งคล้ายกับ semantics ตามค่ามาก!)