"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > क्या आप क्लास प्रकार के संदर्भों का मूल्य निर्धारित कर सकते हैं? एक विरोधाभास समझाया.

क्या आप क्लास प्रकार के संदर्भों का मूल्य निर्धारित कर सकते हैं? एक विरोधाभास समझाया.

2024-11-08 को प्रकाशित
ब्राउज़ करें:967

 Can You Assign to Rvalue References of Class Type?  A Paradox Explained.

वर्ग प्रकार के 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