2010-11-18 4 views
35

निम्नलिखित कोड ठीक काम करता है, लेकिन यह सही कोड क्यों है? Foo() वैध द्वारा लौटाए गए अस्थायी "c_str()" सूचक क्यों है? मैंने सोचा, कि बार() दर्ज होने पर यह अस्थायी पहले ही नष्ट हो चुका है - लेकिन ऐसा लगता है कि ऐसा नहीं लगता है। तो, अब मुझे लगता है कि कॉल (बार) के बाद foo() द्वारा अस्थायी रूप से लौटाया जाएगा - क्या यह सही है? और क्यों?आजीवन आजीवन

std::string foo() { 
    std::string out = something...; 
    return out; 
} 

void bar(const char* ccp) { 
    // do something with the string.. 
} 

bar(foo().c_str()); 

उत्तर

42

$ 12,2/3- "अस्थाई वस्तुओं पूर्ण अभिव्यक्ति (1.9) कि (lexically) बिंदु जहां वे शामिल होते हैं का मूल्यांकन में अंतिम चरण के रूप में नष्ट कर रहे हैं। यह सच है भले ही वह मूल्यांकन में अपवाद फेंकने पर समाप्त हो। "

foo() द्वारा अस्थायी रूप से लौटाया गया अस्थायी जीवनकाल पूर्ण अभिव्यक्ति के अंत तक फैला है जहां इसे बनाया गया है यानी फ़ंक्शन कॉल 'बार' के अंत तक।

संपादित करें 2:।

$ 1,9/12- "एक पूर्ण अभिव्यक्ति एक अभिव्यक्ति है कि एक और अभिव्यक्ति का एक उपसूचक नहीं है एक भाषा निर्माण का एक अंतर्निहित कॉल का उत्पादन करने परिभाषित किया गया है एक समारोह, का उपयोग भाषा निर्माण को इस परिभाषा के के प्रयोजनों के लिए अभिव्यक्ति के रूप में माना जाता है। "

+1

यह भी ध्यान दें कि 'c_str() 'केवल एक अस्थायी * सूचक * देता है। इसका जीवनकाल उस डेटा के जीवनकाल के बारे में कुछ भी नहीं कहता है जो यह इंगित करता है। – jalf

+4

'c_str()' अस्थायी रूप से वापस नहीं आता है। यह सूचक प्रकार का एक रैल्यू देता है। सूचक प्रकार के रावल वस्तुओं नहीं हैं। उनके पास जीवन भर नहीं है। –

61

एक अस्थायी वस्तु तब नष्ट हो जाती है जब पूर्ण अभिव्यक्ति में स्पष्ट रूप से उस रावल्यू होते हैं जिसका मूल्यांकन बनाया गया है कि अस्थायी वस्तु का पूरी तरह से मूल्यांकन किया जाता है। मुझे ASCII कला के साथ प्रदर्शन करने दें:

____________________ full-expression ranges from 'b' to last ')' 
bar(foo().c_str()); 
    ^^^^^  ^
     |   | 
    birth  funeral 
+9

ASCII कला के अंदर रूपरेखा चित्र :) बहुत ही चित्रकारी हैं। मुझे वास्तव में उन्हें पसंद आया – Chubsdad

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

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