कंपाइलर लाइन 1 पर एक त्रुटि क्यों देता है, भले ही प्रतिलिपि कन्स्ट्रक्टर को लाइन 1 में नहीं बुलाया जाएगा और त्रुटि गायब हो जाएगी कॉपी निर्माता हस्ताक्षर const के रूप में घोषित किया जाता है?
वर्ग A {int i; सार्वजनिक: ए (इंट एन): आई (एन) {कॉट & एलटी; & lt; "ए सीटीओआर" & lt; & lt; endl; } ए (ए और ए): i (ए.आई.) {cout & lt; & lt; "ए सी-टाटर" & lt; & lt; endl; } ~ ए () {}}; इंट मुख्य () {ए 1 (1); ए 2 = 2; // लाइन 1 ए ए 3 = ए 1; // लाइन 2} // उपरोक्त कोड को मिनजीड के साथ संकलित किया गया था
यह अंतर्निहित कन्स्ट्रक्टर कॉल का एक प्रभाव है। कंस्ट्रक्टर घोषणा से पहले "स्पष्ट" खंड जोड़ने का प्रयास करें
.... स्पष्ट ए (इंट एन): i (n) {cout & lt; & lt; "ए सीटीओआर" & lt; & lt; endl; } .... यह देखते हुए कि, संकलक की तरह शिकायत करेगा " गैर अदिश प्रकार के 'int' 'ए' का अनुरोध किया से रूपांतरण"। यह कुछ प्रकाश क्यों शेड करता है: ए 2 = 2; // पंक्ति 1, मूल, स्पष्ट निर्माण पर विफल रहता है ए 2 = ए (2); // लाइन 1, ऑटो प्रतिस्थापित संकलक द्वारा निहित निर्माण की अनुमति दी है, तो तो, अगर हमारे संकलक एक तरह से स्वचालित रूप से निर्माता कॉल के माध्यम से दूसरे करने के लिए एक प्रकार परिवर्तित करने के लिए मिल सकता है, यह इसके ऑटो को दर्शाता है यहाँ
इसके अलावा इस जवाब "क्यों 'स्थिरांक' प्रतिलिपि निर्माता के लिए आवश्यक" देता है।
<कोड> एक a2 = एक (2); ए 2 (ए (2)); // '= ऑपरेटर' के डिफ़ॉल्ट कार्यान्वयन यहां, एक (2) अस्थायी वस्तु है। इस प्रकार, संकलक इसे करने के लिए गैर-स्थिरांक संदर्भ प्राप्त करने की कोशिश करेंगे और विफल रहता है (क्योंकि यह rvalue है - अन्यथा आप कुछ है कि पंक्ति के अंत में मर जाएगा बदलने की कोशिश कर सकते हैं) ।
No comments:
Post a Comment