2012-02-06 27 views
16

क्या यह अस्थायी संदर्भ काफी लंबे समय तक जीवित रहता है?

template <typename T> 
T const & foo(T const & dflt) 
    { return /* ... */ ? /* ... */ : dflt; } 

int x = foo(5); 

में अस्थायी के संदर्भ में "जीवित रहने के" करता है जब तक यह एक्स के लिए निर्दिष्ट की?

(मैं इसे foo() कॉल की अवधि बचता है, लेकिन काम मुझे संकोच बनाता है)

प्रश्न में कोड यहाँ स्थिरांक संदर्भ पर निर्भर, यानी मैं दो अलग-अलग की आवश्यकता होगी के लिए कुछ वैध का उपयोग करता है कार्यों

T const & foo_cr(T const & dflt); 
T const & foo_v(T dflt); 

जो मैं से बचना चाहते हैं (सिर्फ एक ही नाम wiht अलग हस्ताक्षर पर भरोसा मेरे लिए थोड़ा जोखिम भरा लगता है।)

+0

'... क्या करता है? ...: डीएफएलटी; 'इसका मतलब होना चाहिए? 0_o –

+1

'... 'इस संदर्भ में" कोड है जो प्रश्न के लिए अप्रासंगिक है। मैंने इसे टिप्पणियों में बदल दिया है, शायद यह स्पष्ट है। – peterchen

उत्तर

14

अस्थायी के संदर्भ में करता है "जीवित रहने के" यू जब तक यह एक्स को असाइन नहीं किया जाता है?

आम तौर पर, हाँ। यदि foodflt लौटाता है, तो उस संदर्भ (अस्थायी 5 तक) पूर्ण अभिव्यक्ति के अंत तक वैध है, जिसका अर्थ है, प्रारंभिक होने के बाद तक।

सी ++ 03, 12.2/3:

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

अधिकतर 12.2/4 और 12.2/5 में आता है, विशेष रूप से इस नियम के अपवाद।

मैं नहीं देख सकता कि क्या होता है जब यह ... लौटाता है, लेकिन मुझे लगता है कि आप इसके बारे में नहीं पूछ रहे थे।

+7

वर्तमान में यह निर्दिष्ट नहीं है कि "x" में स्टोर पूर्ण का हिस्सा है अभिव्यक्ति। http://llvm.org/bugs/show_bug.cgi?id=9783 देखें, हालांकि दोनों समिति और (उम्मीदवार) उपयोगकर्ताओं द्वारा दृढ़ता से वांछित है। लेकिन इससे स्वतंत्र, यह पहले से ही उस spec द्वारा निर्दिष्ट किया गया है जो * पढ़ा गया है * 'foo' (lvalue-to-rvalue) द्वारा संदर्भित संदर्भ का पूर्ण अभिव्यक्ति का हिस्सा है। 1.9p10 और इसके पीछे उदाहरण देखें। –

+0

त्वरित उत्तर के लिए धन्यवाद! हाँ, ... मामला सुरक्षित है - मैं बस इसे बाहर रखा गया (अतिरिक्त पैरामीटर के रूप में संदर्भ द्वारा पारित संग्रह के तत्व के संदर्भ में) – peterchen