2010-11-10 15 views
6

मैं निम्नलिखित फार्म के कोड से देख रहा हूँ:मूल्य आरंभीकरण एक स्थिरांक सदस्य के संदर्भ

class foo 
{ 
    public: 
    foo() {} 

    //... 
}; 

class bar 
{ 
    public: 
    bar() : ref() {} 

    private: 
    const foo &ref; 
}; 

एक संदर्भ सही इस तरह से एक अस्थायी का उपयोग कर आरंभ कर रहा है? मुझे पता है कि एक कॉन्स्ट्रेंस को प्रारंभ करना संभव है जो अस्थायी के साथ एक स्थानीय चर है, और ऐसा करने से अस्थायी जीवनकाल बढ़ जाता है, उदा।

const foo &tmp = funcThatReturnsByValue(); //OK 

हालांकि, संबंधित initialize reference in initialization list के जवाब में से एक से पता चलता है वहाँ "अल्पकालिक" और "लंबे समय से रहते थे" संदर्भ, और अपरिभाषित व्यवहार है कि जैसा कि ऊपर आरंभ ref है (यहां तक ​​कि ref हालांकि बीच एक अंतर है कि एक const संदर्भ है)।

मानक में 12.2.5 मानक कहते हैं, "कुछ हिस्सों में," एक कन्स्ट्रक्टर के सीटीओ-प्रारंभकर्ता में एक संदर्भ सदस्य के लिए एक अस्थायी बाध्य कन्स्ट्रक्टर बाहर निकलने तक जारी रहता है। " क्या यह इस स्थिति का वर्णन कर रहा है?

+0

क्या आप अपना कोड ठीक कर सकते हैं ताकि वास्तव में इसमें अस्थायी हो? –

+0

रेफरी() foo के अस्थायी उदाहरण से refind नहीं है? क्षमा करें अगर मेरी शब्दावली कमजोर है ... मैं इस कोड स्निपेट को समझने के लिए अपनी पूरी कोशिश कर रहा हूं। – user168715

+0

शायद यह टिप्पणी बेकार है (मुझे इस कोड को आप जिस संदर्भ में देख रहे हैं उसे नहीं जानते हैं), लेकिन अगर समस्या 'सूचक' है तो समस्या गायब हो जाती है। मुद्दा यह है कि संदर्भ मूल्य-प्रारंभिक नहीं हो सकते हैं, लेकिन पॉइंटर्स (वे शून्य-प्रारंभिक हो सकते हैं)। इसके अलावा, अधिकांश कंपाइलर (कम से कम एमएसवीसी) डिफ़ॉल्ट असाइनमेंट ऑपरेटर उत्पन्न करने में असमर्थ होने के लिए चेतावनी जारी करते हैं। दिशानिर्देश के रूप में, जब भी आप एक संदर्भ सदस्य चाहते हैं, तो आप वास्तव में एक सूचक चाहते हैं ... –

उत्तर

4

यह कोड खराब है। आप किसी संदर्भ को प्रारंभ करने या प्रारंभ करने के लिए डिफ़ॉल्ट रूप से प्रारंभ नहीं कर सकते हैं।

यदि आपके पास वास्तव में ref() के अंदर एक अभिव्यक्ति थी, तो हाँ, 12.2.5 लागू होगा और जब निर्माता बाहर निकलता है तो अस्थायी नष्ट हो जाएगा।

+1

आपको लगता है, लेकिन मुझे वास्तव में ऐसा करने के लिए जीसीसी 4.3.4 नहीं मिल सकता है। –

1

मुझे लगता है कि आप क्या करना चाहते हैं:

bar() : ref(foo()) {} 

नहीं बल्कि भोलेपन से लगता है कि एक अस्थायी के जीवनकाल वहाँ यह करने के लिए एक संदर्भ है जब तक बढ़ा दिया गया है है। नहीं, यह वास्तव में नहीं है। तो, चाहे आधार है या नहीं, आप संदर्भ को सामान्य वस्तु के साथ प्रारंभ करना चाहते हैं।

2

आपका उदाहरण एक अस्थायी नहीं बना रहा है - यह है कि आप को बदलने की जरूरत है ऐसा करने के लिए:

bar() : ref(foo()) {} 

अब आप एक अस्थायी के संदर्भ में बाध्यकारी रहे हैं, और कहा कि अस्थायी वस्तु अंत में नष्ट कर दिया जाएगा निर्माता का। आपका संदर्भ अमान्य होगा, और यह एक अच्छी बात नहीं है।

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