ตัวดำเนินการแปลงค่าส่งคืนที่อนุมานนั้นค่อนข้างแปลก แต่แนวคิดหลักคือมันทำหน้าที่เหมือนพารามิเตอร์ฟังก์ชั่นเพื่อเลือกอันไหนที่ใช้
และเมื่อตัดสินใจระหว่างT&&
และชนะในกฎระเบียบมติเกินพิกัด นี่คือการอนุญาต:T&
T&
template<class T>
void f( T&& ) { std::cout << "rvalue"; }
template<class T>
void f( T& ) { std::cout << "lvalue"; }
ไปทำงาน. T&&
สามารถจับคู่กับ lvalue ได้ แต่เมื่อทั้ง lvalue และ universal reference overload มีอยู่ lvalue อันที่ต้องการ
ชุดของตัวดำเนินการแปลงที่เหมาะสมน่าจะเป็น:
template <typename T>
operator T&&() &&;
template <typename T>
operator T &() const; // maybe &
หรือแม้กระทั่ง
template <typename T>
operator T() &&;
template <typename T>
operator T &() const; // maybe &
เพื่อป้องกันการยืดอายุการใช้งานที่ล้มเหลวจากการกัดคุณ
3 ประเภทที่ใช้ในการกำหนดการสั่งซื้อขึ้นอยู่กับบริบทที่สั่งซื้อบางส่วนเสร็จสิ้น:
[SNIP]
(3.2) ในบริบทของการเรียกไปยังฟังก์ชันการแปลงจะใช้ชนิดการส่งคืนของแม่แบบฟังก์ชันการแปลง
ซึ่งจะจบลงที่ขึ้นอยู่กับกฎ "พิเศษเพิ่มเติม" เมื่อเลือกโอเวอร์โหลด:
(9.1) ถ้าชนิดจากเท็มเพลตอาร์กิวเมนต์เป็นข้อมูลอ้างอิงแบบ lvalue และชนิดจากเท็มเพลตพารามิเตอร์ไม่ประเภทของพารามิเตอร์นั้นไม่ได้รับการพิจารณาว่ามีความเชี่ยวชาญอย่างน้อยเท่ากับชนิดอาร์กิวเมนต์ มิฉะนั้น,
ดังนั้นจึงoperator T&&
ไม่ได้อย่างน้อยเป็นความเชี่ยวชาญเป็นoperator T&
ขณะที่รัฐไม่มีกฎoperator T&
ไม่ได้อย่างน้อยเป็นความเชี่ยวชาญเป็นoperator T&&
เพื่อให้มีความเชี่ยวชาญมากกว่าoperator T&
operator T&&
เทมเพลตที่เชี่ยวชาญมากขึ้นจะได้รับการแก้ไขที่เกินความต้องการน้อยกว่าทุกสิ่งที่เท่ากัน