2012-04-17 24 views
9

मैं (सरलीकृत संस्करण) इस कोड है:क्या एक फ़ंक्शन पैरामीटर से संबंधित संदर्भ उस अस्थायी जीवनकाल को लंबा करेगा?

const int& function(const int& param) 
{ 
    return param; 
} 

const int& reference = function(10); 
//use reference 

मैं काफी हद तक तय नहीं कर सकता जो सी ++ 03 स्टैंडर्ड $ 12.2/5 शब्दों के

जो करने के लिए अस्थायी संदर्भ बाध्य है या अस्थायी जो एक उप-वस्तु के लिए पूर्ण वस्तु है जिसके अस्थायी सीमा संदर्भ के जीवनकाल के लिए बनी रहती है ...

यहां लागू है।

reference उपरोक्त कोड या गलत के कोड में चर है? कॉलिंग कोड में संदर्भ अस्थायी के जीवनकाल को पैरामीटर के रूप में पारित करेगा?

उत्तर

9

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

const int& reference = function(10); 

आदेश तर्क 10 साथ function फोन करने के लिए, एक अस्थायी स्थिरांक-संदर्भ वस्तु अस्थायी पूर्णांक वस्तु 10 करने के लिए बनाया गया है: इस मामले में, पूर्ण अभिव्यक्ति कॉल function(10) युक्त काम अभिव्यक्ति है। अस्थायी पूर्णांक का जीवनकाल और अस्थायी कॉन्स्ट-रेफरेंस असाइनमेंट के माध्यम से विस्तारित होता है, इसलिए असाइनमेंट अभिव्यक्ति मान्य है, reference द्वारा संदर्भित पूर्णांक का उपयोग करने का प्रयास reference के रूप में अनिर्धारित व्यवहार अब लाइव ऑब्जेक्ट का संदर्भ नहीं देता है।

अस्थायी करने के लिए जो संदर्भ बाध्य है या अस्थायी है कि एक subobject की पूरी वस्तु संदर्भ बनी रहती ही है जो करने के लिए है:

सी ++ 11 स्टैंडर्ड, मुझे लगता है, स्थिति स्पष्ट करते हैं सिवाय संदर्भ के जीवन भर के लिए:

...

- एक समारोह कॉल (5.2.2) में एक संदर्भ पैरामीटर के लिए एक अस्थायी बाध्य पूर्ण अभिव्यक्ति कॉल युक्त के पूरा होने तक बनी रहती है।

संपादित करें: "अस्थायी करने के लिए जो संदर्भ ही है ... संदर्भ के जीवन भर के लिए बनी रहती है"। इस मामले में, संदर्भ का जीवनकाल असाइनमेंट अभिव्यक्ति के अंत में समाप्त होता है, जैसा अस्थायी पूर्णांक का जीवनकाल होता है।

2

यह संकलित होगा, लेकिन आप एक खतरनाक संदर्भ के साथ खत्म हो जाएगा। function रिटर्न के बाद मुक्त हो गया है।

  1. समारोह अस्थायी, अनाम वस्तु
  2. फ़ंक्शन संदर्भ
  3. अब कि समारोह वापस आ गया है अस्थायी परम जारी की है
  4. संदर्भ अब झूलते है के रूप में वस्तु थी के लिए एक संदर्भ के साथ कहा जाता है नष्ट

यदि आपने इसे गैर-स्थिर बना दिया है, तो यह संकलित नहीं होता क्योंकि आप किसी अज्ञात ऑब्जेक्ट के गैर-कॉन्स्ट संदर्भ को पास नहीं कर सकते हैं।

+0

असाइनमेंट के अंत में 'param' नष्ट नहीं हुआ है? "अस्थायी वस्तुओं को पूर्ण अभिव्यक्ति (1.9) का मूल्यांकन करने के अंतिम चरण के रूप में नष्ट कर दिया गया है (लेक्सिकल) में वह बिंदु शामिल है जहां वे बनाए गए थे।" –

1

यह इस बात यह है कि महत्वपूर्ण

है अस्थायी करने के लिए जो संदर्भ

ही है इस मामले पैरामीटर अस्थायी करने के लिए बाध्य किया जाता है, और कॉल के बाद नष्ट हो जाएगा है।

आप संदर्भ पारित करके जीवन भर आगे नहीं बढ़ा सकते हैं।

+1

आप इनकार नहीं कर सकते कि उसका 'संदर्भ' अस्थायी है। असल में कई संदर्भ अस्थायी हैं। मानक यहां बहुत बुरी तरह बुलाया जाता है। इरादा निश्चित रूप से है कि जीवनकाल केवल वास्तविक अस्थायी के साथ शुरू किए गए संदर्भ से मेल खाता है। अफसोस की बात है, यह वास्तव में मानक नहीं कहता है। –

+2

@ जेम्सस्केज़: मैं मानता हूं कि शब्द बहुत सटीक नहीं है, लेकिन कहा जा रहा है कि, एक अलग संकलन मॉडल के साथ, संकलक के लिए यह असंभव होगा कि अस्थायी जीवनकाल समारोह के बाद कॉल साइट पर बढ़ाया जाना चाहिए पूरा करता है। संकलक संभवतः यह नहीं जान सकता कि लौटा संदर्भ पैरामीटर या किसी अन्य ऑब्जेक्ट (यानी 'कॉन्स इंट एंड फ़ंक्शन (कॉन्स इंट एंड) {स्थिर int i = 0; वापसी i;} ' –

+0

के समान ऑब्जेक्ट से जुड़ा हुआ है या नहीं, यह उत्तर' टी कुछ भी संबोधित करें ... और अस्थायी रूप से कॉल के अंत में अर्धविराम पर नष्ट हो गया है, कॉल के तुरंत बाद नहीं। – Potatoswatter

2
सी ++ 11 से

viepoint एक संदर्भ में एक समारोह से लौट आए है नहीं एक अस्थायी:

12.12.1 वर्ग प्रकार के temporaries विभिन्न संदर्भों में बनाई गई हैं: एक prvalue के लिए एक संदर्भ बाध्यकारी (8.5.3), एक प्रावधान (6.6.3) लौटा रहा है, एक रूपांतरण जो एक अपवाद (4.1.1, 5.2.9, 5.2.11, 5.4) बनाता है, एक अपवाद फेंकता है (15.1), एक हैंडलर (15.3) में प्रवेश करता है, और कुछ प्रारंभिकरणों में (8.5)।

एक संदर्भ लौटने वाला एक फ़ंक्शन प्रबल ("शुद्ध रावल्यू") वापस नहीं लौटाता है, इसलिए यह अस्थायी नहीं है। यह काफी स्वाभाविक लगता है: संकलक संदर्भित वस्तुओं के जीवन का प्रबंधन नहीं कर सकते हैं, यह प्रोग्रामर की जिम्मेदारी

इस प्रकार है, संकलक के बाद से यह अस्थायी घिरा नहीं है स्थिरांक पूर्णांक & संदर्भ के लिए किसी भी liftime guarantes प्रदान नहीं करता है।

+0

... और यह एक ऐसा स्थान है जहां सी ++ 11 सी ++ 03 की निश्चित संदिग्ध शब्दावली है, एक फिक्स जिसे पीछे से लागू करने के लिए लिया जाना चाहिए। – Potatoswatter