2015-05-19 4 views
20

प्रश्न: क्या एक अनदेखा वापसी मूल्य तुरंत नष्ट हो गया है या इस समय गुंजाइश से बाहर निकल रहा है।सी ++: क्या अनदेखा वापसी मूल्य विनाश व्यवहार अच्छी तरह से परिभाषित किया गया है

मेरी संकलक के लिए रिटर्न नीचे कोड

आउटपुट:

कौन बनाता है, इसके बारे में कोई जरूरत नहीं है।

कौन इसे खरीदता है, इसका कोई उपयोग नहीं है।

इसका उपयोग कौन करता है और न ही इसे देख सकता है।

यह क्या है?

इसलिए अनदेखा मूल्य तत्काल नष्ट हो जाता है। लेकिन क्या यह संकलक विशिष्ट या मानक व्यवहार है?

struct foo 
{ 
    ~foo() 
    { 
     std::cout << "Who makes it, has no need of it. \n" 
       << "Who buys it, has no use for it. \n"; 
    } 
} 

foo createFoo() 
{ 
    return foo(); 
} 

int main(int argc, char* argv[]) 
{ 
    createFoo(); 
    std::cout << "Who uses it can neither see nor feel it.\n" 
       << "What is it?"; 
} 

उत्तर

15

अस्थायी तुरंत नष्ट हो जाता है के बाद पूर्ण अभिव्यक्ति छोड़कर पूरा करता है, तो अपने जीवनकाल एक rvalue या स्थिरांक lvalue संदर्भ के लिए बाध्य किया जा रहा द्वारा बढ़ाया है लौट आए।

+4

... या एक रावल्यू संदर्भ के लिए। – Angew

+0

शायद एक उदाहरण उपयोगी होगा – user1235183

+1

बस "const" शब्द को हटा दें। इसके अलावा, क्रिया * नष्ट * है। –

5

मानक 5.11 में

कुछ संदर्भों में है, एक अभिव्यक्ति केवल अपने साइड इफेक्ट के लिए प्रकट होता है। इस तरह की एक अभिव्यक्ति को अभिव्यक्ति को त्याग दिया गया मान कहा जाता है। अभिव्यक्ति का मूल्यांकन किया जाता है और इसका मूल्य त्याग दिया जाता है।

तो जब अभिव्यक्ति समाप्त होती है तो मान को त्याग दिया जाता है और यदि यह एक वर्ग प्रकार है तो विनाशक कहा जाता है।

+1

इसके अलावा, 12.8.32 अंक बताते हैं कि संकलक वापसी मूल्य की प्रतिलिपि बना सकते हैं, जैसा कि यहां किया गया था। एक अलग कंपाइलर दो बार पहेली के पहले भाग को प्रिंट कर सकता है क्योंकि यह एक प्रतिलिपि को नष्ट कर देगा क्योंकि यह 'createFoo' के दायरे को छोड़ देता है और एक बार' मुख्य 'कॉलिंग' createFoo' 'में लाइन पर, नाथन के जवाब बताते हैं। –

4

§12.2 /3

अस्थायी वस्तुओं पूर्ण अभिव्यक्ति (1.9) कि (lexically) बिंदु है जहां वे शामिल होते हैं का मूल्यांकन करने में अंतिम चरण के रूप में नष्ट कर रहे हैं। यह सच है भले ही वह मूल्यांकन अपवाद फेंकने में समाप्त हो। को नष्ट करने के मूल्य गणना और दुष्प्रभाव एक अस्थायी वस्तु केवल पूर्ण अभिव्यक्ति के साथ जुड़े होते हैं, न कि किसी विशिष्ट उप-संपीड़न के साथ।

अपवाद रचनाकार तर्क के लिए हैं, और एक अस्थायी संदर्भ बाध्यकारी के लिए हैं। (§12.3/4 एफ।)

+0

विशेष रूप से, कन्स्ट्रक्टर डिफ़ॉल्ट तर्क द्वारा बनाए गए केवल अस्थायी। –

+0

एक अतिरिक्त अपवाद है जो सरणी प्रारंभ करते समय होता है। – Brian

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