2012-07-19 10 views
53

संभव डुप्लिकेट:
Does a const reference prolong the life of a temporary?अस्थायी वस्तु रिटर्निंग और स्थिरांक संदर्भ के लिए बाध्य

मेरे संकलक स्थिरांक संदर्भ के लिए अस्थायी बताए के बारे में शिकायत नहीं करता है:

string foo() { 
    return string("123"); 
}; 

int main() { 
    const string& val = foo(); 
    printf("%s\n", val.c_str()); 
    return 0; 
} 

क्यों ? मैंने सोचा कि foo से लौटाई गई स्ट्रिंग अस्थायी है और वैल ऑब्जेक्ट को इंगित कर सकता है कि कौन सा जीवनकाल समाप्त हो गया है। क्या सी ++ मानक इसकी अनुमति देता है और लौटे ऑब्जेक्ट के जीवनकाल को बढ़ाता है?

+4

हां, अस्थायी जीवनकाल लंबे समय तक लंबा है जब तक यह ** कॉन्स ** संदर्भ है। – chris

+2

यह वास्तव में 2784262 का डुप्लिकेट नहीं है, जो (केस) उस मामले का इलाज करेगा जहां संदर्भ एक वर्ग सदस्य है। व्यवहार अलग है। – aberaud

+1

@aberaud न केवल यह एक डुप्लिकेट है, यह एक बेहतर सवाल है जिसे मैंने पाया है। – dashesy

उत्तर

66

यह एक सी ++ सुविधा है। कोड मान्य है और यह वही करता है जो ऐसा लगता है।

आम तौर पर, एक अस्थायी वस्तु केवल पूर्ण अभिव्यक्ति के अंत तक ही चलती है जिसमें यह प्रतीत होता है। हालांकि, सी ++ जानबूझकर निर्दिष्ट करता है कि स्टैक पर किसी न किसी अस्थायी वस्तु को बाध्य करने के संदर्भ में अस्थायी जीवनकाल को संदर्भित करता है, और इस प्रकार से बचा जाता है कि अन्यथा एक आम खतरनाक-संदर्भ त्रुटि क्या होगी। उपर्युक्त उदाहरण में, foo() द्वारा अस्थायी लौटा बंद घुमावदार ब्रेस तक रहता है।

पीएस: यह केवल स्टैक-आधारित संदर्भों पर लागू होता है। यह संदर्भों के लिए काम नहीं करता है जो वस्तुओं के सदस्य हैं।

पूर्ण पाठ: GotW #88: A Candidate For the “Most Important const” by Herb Sutter

+2

इसके अलावा, कृपया ध्यान दें कि स्ट्रिंग पर कोई प्रतिलिपि नहीं की जाती है, स्ट्रिंग के लिए एक प्रतिलिपि निर्माता मौजूद होना चाहिए और पहुंच योग्य होना चाहिए। – xryl669

+0

** पीएस ** फिर से, यह बहुत महत्वपूर्ण है, और ऊपर दिए गए डुप्ले एसओ थ्रेड में –

+0

@ xryl669 का अच्छा चित्र है [सी ++ 17 गारंटीकृत प्रति एलिशन] (http: //www.open-std। संगठन/jtc1/sc22/wg21/दस्तावेज़/कागजात/2015/p0135r0.html) मतलब कॉपी कन्स्ट्रक्टर अब आवश्यक नहीं है? उद्धरण: '' 'जब स्रोत वस्तु अस्थायी' ' – dashesy