c++ - In copy-initialization, is the call to the copy constructor explicit or implicit? -
वर्ग एएए {सार्वजनिक: स्पष्ट एएए (const एएए & amp;) {} एएए (इंट) {}}; Int main () {एएए ए = 1; वापसी 0; } उपरोक्त कोड में, जैसा कि मैं समझता हूं, हालांकि ज्यादातर मामलों में लुप्त होकर, प्रतिलिपि निर्माता अब भी अर्थात् रूप से कॉल करने के लिए आवश्यक है। मेरा सवाल है, क्या कॉल स्पष्ट या अंतर्निहित है? एक लंबे समय के लिए मेरे मन में यह निष्कर्ष है कि एएए :: एएए (एएनए) को कॉल निहित है लेकिन प्रतिलिपि कन्स्ट्रक्टर को कॉल नहीं है। आज मुझे गलती से उपरोक्त कोड को संकलित करने के लिए जी ++ मिला है और यह त्रुटि की सूचना दी है। यदि गंतव्य प्रकार एक (संभवतः सीवी-योग्य) वर्ग प्रकार है: Ul>
यदि प्रारंभिकता प्रत्यक्ष-प्रारंभिक रूप से है, या यदि यह प्रति-आरंभीकरण है, जहां स्रोत का सीवी-अयोग्य संस्करण एक ही वर्ग है, या एक व्युत्पन्न वर्ग, गंतव्य का वर्ग है , कन्स्ट्रक्टर माना जाता है लागू कंस्ट्रक्टरों की गणना (13.3.1.3) है, और अधिभार संकल्प (13.3) के माध्यम से सर्वश्रेष्ठ चयन किया जाता है। इस प्रकार चयनित कन्स्ट्रक्टर को ऑब्जेक्ट को आरंभ करने के लिए कहा जाता है, आरंभिक अभिव्यक्ति या अभिव्यक्ति-सूची के साथ इसकी तर्क (ओं) के रूप में यदि कोई कन्स्ट्रक्टर लागू नहीं होता है, या ओवरलोड रिजॉल्यूशन अस्पष्ट है, तो प्रारंभिक रूप से बीमार रूप से बनता है।
अन्यथा (अर्थात, शेष कॉपी-आरंभीकरण मामलों के लिए), उपयोगकर्ता-परिभाषित रूपांतरण अनुक्रम जो स्रोत प्रकार से गंतव्य प्रकार में परिवर्तित हो सकते हैं या (जब रूपांतरण फ़ंक्शन उपयोग किया जाता है) किसी व्युत्पन्न कक्षा में 13.3.1.4 में वर्णित है, और अधिभार संकल्प (13.3) के माध्यम से सबसे अच्छा चयन किया जाता है। यदि रूपांतरण किया जा सकता है या अस्पष्ट है, तो प्रारंभिक रूप से गलत तरीके से बना हुआ है। चुना गया कार्य प्रारंभिक रूप से अपनी अभिव्यक्ति के रूप में अभिव्यक्ति के साथ कहा जाता है; यदि फ़ंक्शन एक कन्स्ट्रक्टर है, तो कॉल को अस्थायी रूप से गंतव्य प्रकार के सीवी-अयोग्य संस्करण के लिए आरम्भ किया जाता है। अस्थायी एक प्राइव्यू है। कॉल के परिणाम (जो कन्स्ट्रक्टर मामले के लिए अस्थायी है) का उपयोग तब ऊपर के नियमों के अनुसार, सीधे- initialize करने के लिए किया जाता है, जो कि प्रतिलिपि-प्रारंभिककरण का गंतव्य है कुछ मामलों में, एक प्रत्यक्ष कार्यान्वयन को सीधे प्रत्यक्ष रूप से शुरू होने वाले वस्तु में मध्यवर्ती परिणाम का निर्माण करके इस प्रत्यक्ष-प्रारंभ में निहित कॉपी को समाप्त करने की अनुमति है; 12.2, 12.8 देखें। ऊपर दिए गए कोट्स में बोल्डेड डायरेक्ट-इनिशियलाइज़ का मतलब है कि कन्वर्टर को कॉपी करने के लिए कॉल स्पष्ट, सही है ? क्या जी ++ गलत है या मानक गलत की मेरी व्याख्या?
इस बग की तरह दिखता है: < Blockquote>
जी ++ निम्न कोड को संकलित करने में विफल रहता है
struct X {X (int) {} स्पष्ट एक्स (एक्स const & amp;) {}}; Int main () {X x = 1; // त्रुटि: 'एक्स :: एक्स (एक्स)'}} के लिए कॉल करने के लिए कोई मेल नहीं खाती एक कॉपी प्रारंभिकरण का दूसरा चरण (देखें 8.5 / 16/6/2) प्रत्यक्ष-प्रारंभ जहां स्पष्ट निर्माता को उम्मीदवार कार्यों के रूप में माना जाएगा।
Comments
Post a Comment