2011-03-28 15 views
10

संभव डुप्लिकेट:
C++: Life span of temporary arguments?पूर्ण अभिव्यक्ति की सीमाओं और temporaries के जीवनकाल

कहा जाता है कि अस्थायी चर पूर्ण अभिव्यक्ति का मूल्यांकन करने में अंतिम चरण है, उदा नष्ट कर रहे हैं

bar(foo().c_str()); 

अस्थायी सूचक

baz(bar(foo().c_str())); 

के लिए बार रिटर्न जब तक रहता है, लेकिन क्या है यह अभी भी बार रिटर्न जब तक रहता है, या baz वापसी यहाँ पूर्ण अभिव्यक्ति अंत का मतलब है, compilers मैं के बाद विनाश वस्तुओं की जाँच बाज़ रिटर्न, लेकिन क्या मैं उस पर भरोसा कर सकता हूं?

+0

हां, इस प्रश्न का उत्तर http://stackoverflow.com/questions/4214153/lifetime-of-emporporaries का हिस्सा होना चाहिए, मैंने एक नया पूछा क्योंकि मुझे वहां टिप्पणियां पोस्ट करने का अधिकार नहीं है और मैं था एक विशिष्ट विस्तार में दिलचस्पी है जो वहां शामिल नहीं है। – Vasaka

उत्तर

10

पूर्ण अभिव्यक्ति के अंत तक अस्थायी जीवन, जिसमें वे बनाए जाते हैं। एक "पूर्ण अभिव्यक्ति" एक अभिव्यक्ति है जो किसी अन्य अभिव्यक्ति की उप-अभिव्यक्ति नहीं है।

baz(bar(...)); में, bar(...)baz(...) के उपसूचक, जबकि baz(...) कुछ भी की एक उपसूचक नहीं है। इसलिए, baz(...) पूर्ण अभिव्यक्ति है, और इस अभिव्यक्ति के मूल्यांकन के दौरान बनाए गए सभी अस्थायी को baz(...) के बाद तक हटाया नहीं जाएगा।

+2

नोट, हालांकि, रचनाकार एक विशेष मामला हैं (मुझे लगता है - 9 0% निश्चित), ताकि 'बाज़ (एक्स (foo()। C_str()));', जहां 'एक्स' एक वर्ग और तर्क है 'बाज़' के लिए 'एक्स' के कन्स्ट्रक्टर को कॉल किया गया है, जब 'कन्स्ट्रिंग' का जीवनकाल समाप्त हो जाएगा जब निर्माता बाहर निकलता है। –

3

जैसा कि नाम से पता चलता है, पूर्ण अभिव्यक्ति सभी अभिव्यक्ति है, जिसमें baz() पर कॉल शामिल है, और इसलिए अस्थायी baz() रिटर्न पर कॉल तक लाइव रहेगा।

संबंधित मुद्दे