c++ - Whose destructor is this one? -
नीचे दिए गए कोड में:
#include & lt; स्ट्रिंग & gt; # शामिल करें & lt; iostream & gt; Struct एस {std :: string a; Int b; एस (const एस & amp;) = डिफ़ॉल्ट; एस (एस एंड amp;) = डिफ़ॉल्ट; & Amp; ऑपरेटर = (सेट एस & amp;) = डिफ़ॉल्ट; & Amp; ऑपरेटर = (एस एंड amp;) = डिफ़ॉल्ट; // यहां जरूरी नहीं है लेकिन इसे पूर्णता के लिए जोड़ा जाना चाहिए ~ एस () {std :: cout & lt; & lt; एक & lt; & lt; "" & Lt; & lt; बी एंड एलटी; & lt; std :: endl; }}; एस एफ (एस आर्ज) {एस s0 {}; एस एस 1 (एस 0); // s1 {s0}; पुस्तक में s1 = arg; वापसी s1; } Int main () {एस एस 3 {"उपकरण", 42}; च (S3); }
मुझे निम्न आउटपुट मिलता है (मैंने अपनी युक्तियों के साथ आउटपुट टिप्पणी की थी):
42 // ??? 0 / s0 उपकरण को नष्ट कर दिया गया है 42 / / एआरजी उपकरण नष्ट कर दिया है 42 / / पर वापस लौटने के मूल्य एफ उपकरण नष्ट हो गया है 42 / s3 नष्ट हो जाता है
जिसके विनाशक एक है जो outputs 42 ?? मैं इसे समझ नहीं सकता
स्वचालित वैरिएबल घोषणा के रिवर्स ऑर्डर में नष्ट हो जाते हैं, इसलिए डिस्ट्रिक्टर ने बताया है s1
के नाशक।
कारण यह मान मानता है {"", 42}
प्रोग्राम में उस बिंदु पर है कि वापसी मान f
चाल निर्माण द्वारा आरंभ किया जा रहा है; यह है, s1
को xvalue के रूप में माना जा रहा है यह [class.copy] / 32:
में नियम से है, जब प्रतिलिपि ऑपरेशन के elision के मानदंड मिले हैं या इस तथ्य के लिए मिले हैं कि स्रोत ऑब्जेक्ट एक फ़ंक्शन पैरामीटर है, और प्रतिलिपि करने वाला ऑब्जेक्ट एक लावल्यू द्वारा निर्दिष्ट किया जाता है, प्रतिलिपि के लिए कन्स्ट्रक्टर का चयन करने के लिए ओवरलोड रिज़ॉल्यूशन पहले की गई है जैसे ऑब्जेक्ट को एक रैवल्यू द्वारा निर्दिष्ट किया गया था।
Comments
Post a Comment