घटाया गया वापसी मूल्य रूपांतरण ऑपरेटर थोड़ा अजीब हैं। लेकिन मूल विचार यह है कि यह एक फंक्शन पैरामीटर की तरह काम करता है जिसे चुनने के लिए इसका उपयोग किया जाता है।
और जब बीच तय T&&
और अधिभार संकल्प नियमों में जीत। यह अनुमति है:T&
T&
template<class T>
void f( T&& ) { std::cout << "rvalue"; }
template<class T>
void f( T& ) { std::cout << "lvalue"; }
काम करने के लिए। T&&
एक लैवल्यू के खिलाफ मैच कर सकता है, लेकिन जब लैवल्यू और सार्वभौमिक संदर्भ ओवरलोड उपलब्ध होते हैं, तो लैवल्यू एक को प्राथमिकता दी जाती है।
रूपांतरण ऑपरेटरों का सही सेट संभवतः है:
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 आदेश को निर्धारित करने के लिए उपयोग किए जाने वाले प्रकार उस संदर्भ पर निर्भर करते हैं जिसमें आंशिक ऑर्डर किया जाता है:
[कटाव]
(3.2) रूपांतरण फ़ंक्शन के लिए कॉल के संदर्भ में, रूपांतरण फ़ंक्शन टेम्पलेट के रिटर्न प्रकार का उपयोग किया जाता है।
जब अधिभार उठाते समय "अधिक विशिष्ट" नियमों के आधार पर समाप्त होता है:
(9.1) यदि तर्क टेम्पलेट से प्रकार एक अंतराल संदर्भ था और पैरामीटर टेम्पलेट से प्रकार नहीं था, तो पैरामीटर प्रकार को कम से कम तर्क प्रकार के रूप में विशेष नहीं माना जाता है; अन्यथा,
इस प्रकार operator T&&
कम से कम के रूप में विशेष operator T&
नहीं है, इस बीच कोई नियम राज्यों के operator T&
रूप में कम से कम विशेष नहीं है operator T&&
, इसलिए operator T&
की तुलना में अधिक विशिष्ट है operator T&&
।
अधिक विशिष्ट टेम्पलेट कम से अधिक सब कुछ पर समान रूप से अधिभार संकल्प जीतते हैं।