वर्ग प्रकार के Rvalue संदर्भों को निर्दिष्ट करना: एक विरोधाभास हल किया गया
C के दायरे में, lvalues और rvalues के बीच अंतर सर्वोपरि है। Lvalues स्मृति स्थानों के साथ वस्तुओं का प्रतिनिधित्व करते हैं जिन्हें संशोधित किया जा सकता है, जबकि rvalues अस्थायी वस्तुओं या स्थिरांक को शामिल करते हैं जिन्हें संशोधित नहीं किया जा सकता है। हालाँकि, एक दिलचस्प कोड स्निपेट इस मूलभूत विभाजन के बारे में सवाल उठाता है:
class Y {
public:
explicit Y(size_t num = 0) {}
};
int main() {
Y(1) = Y(0); // Here lies the enigma!
return 0;
}
यह कोड क्यों संकलित होता है? क्या कंस्ट्रक्टर द्वारा लौटाया गया प्रतिद्वंद्विता अल्पकालिक नहीं है और इस प्रकार असाइनमेंट के लिए अनुपयुक्त है?
इस विरोधाभास को समझने की कुंजी C में निहित असाइनमेंट ऑपरेटर में निहित है। जब किसी क्लास के लिए असाइनमेंट ऑपरेटर को स्पष्ट रूप से परिभाषित नहीं किया जाता है, तो कंपाइलर एक डिफ़ॉल्ट असाइनमेंट ऑपरेटर को संश्लेषित करता है। महत्वपूर्ण रूप से, यह संश्लेषित ऑपरेटर कुछ मामलों में प्रतिद्वंद्विता पर लागू हो सकता है।
यह वह जगह है जहां स्पष्ट कीवर्ड एक भूमिका निभाता है। दिए गए उदाहरण में, Y वर्ग एक असाइनमेंट ऑपरेटर घोषित नहीं करता है, इसलिए कंपाइलर एक उत्पन्न करता है। स्पष्ट कीवर्ड प्रतिद्वंद्विता से अंतर्निहित रूपांतरणों को रोकता है, लेकिन यह संश्लेषित असाइनमेंट ऑपरेटर को प्रतिमूल्यों पर लागू होने से नहीं रोकता है।
इस प्रकार, हमारे कोड में, संश्लेषित असाइनमेंट ऑपरेटर:
Y& Y::operator=(Y const&);
या
Y& Y::operator=(Y&);
को बाईं ओर प्रतिद्वंद्विता Y(1) के साथ लागू किया जा सकता है। यह असाइनमेंट को आगे बढ़ने की इजाजत देता है, भले ही Y(1) एक प्रतिद्वंद्विता है। &&&]
वर्ग वाई { जनता: स्पष्ट Y(std::size_t संख्या = 0); Y& ऑपरेटर=(Y const&) & = डिफ़ॉल्ट; };इस मामले में, असाइनमेंट ऑपरेटर को संश्लेषित नहीं किया जाएगा, और एक प्रतिद्वंद्विता को असाइन करने का प्रयास करने पर एक संकलन त्रुटि होगी।अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3