2016-02-12 10 views
6

मुझे आश्चर्य है कि स्थानीय ऑब्जेक्ट का const reference क्यों लौटा रहा है, जबकि local object लौटने पर कानूनी है जब तक आप इसे const reference पर असाइन करते हैं?रिटर्न कॉन्स संदर्भ बनाम अस्थायी ऑब्जेक्ट

vector<int> f_legal() { 
    vector<int> tempVec; 
    tempVec.push_back(1); 
    return tempVec; 
} 

const vector<int>& f_illegal() { 
    vector<int> tempVec; 
    tempVec.push_back(1); 
    return tempVec; 
} 

void g() { 
    const vector<int>& v1 = f_legal(); // legal 
    const vector<int>& v2 = f_illegal(); // illegal 
} 

संपादित करें: मेरे मुद्दा यह है कि अगर एक लौटे स्थानीय चर के लिए एक स्थिरांक रेफरी बताए कानूनी है, तो एक स्थानीय चर के एक लौटे स्थिरांक रेफरी के लिए एक स्थिरांक रेफरी बताए नहीं करना चाहिए और साथ ही कानूनी हो रहा है?

+2

@ एडी हील हां यह सी ++ में अच्छी तरह से परिभाषित है कि एक स्थानीय कॉन्स्ट संदर्भ एक अस्थायी जीवनकाल का विस्तार करेगा जिसमें यह बाध्य है। –

+2

@EdHeal हाँ, यह कानूनी है। मानक में एक विशेष मामला है जो स्थानीय ऑब्जेक्ट को जीवित रखेगा जब तक कि मौजूदा दायरे में इसका कोई संदर्भ न हो। –

उत्तर

6

यहां तक ​​कि अगर आप इसे एक स्थिरांक संदर्भ को निर्दिष्ट करते हैं, वापसी मान घोषित किया जाता है मूल्य द्वारा पारित रूप में, इसका मतलब है कि यह बाहर को कॉपी किया जाएगा [1] एक अस्थायी वस्तु के रूप में, और फिर स्थिरांक संदर्भ से आबद्ध । बाध्यकारी अस्थायी वस्तु const संदर्भ ठीक है, ऑब्जेक्ट को कॉन्स्ट संदर्भ के जीवनकाल से बाहर होने तक नष्ट नहीं किया जाएगा।

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

संपादित

मेरे मुद्दा यह है कि अगर एक लौटे स्थानीय चर के लिए एक स्थिरांक रेफरी बताए कानूनी है, तो एक स्थानीय चर के एक लौटे स्थिरांक रेफरी के लिए एक स्थिरांक रेफरी बताए नहीं करना चाहिए के रूप में कानूनी हो है कुंआ?

बिंदु 1 मामला एक लौटे स्थानीय चर करने के लिए एक स्थिरांक रेफरी बताए नहीं है, यह एक लौटे अस्थायी चर करने के लिए एक स्थिरांक रेफरी निर्धारित कर रहा है है। (जो स्थानीय चर से नकल कर सकते हैं।)


[1] प्रतिलिपि RVO तकनीकी रूप से के अनुसार लोप हो सकता है।

+0

क्या आप वाकई हमेशा मामले हैं? यहां तक ​​कि 'आरवीओ/एनआरवीओ' पर विचार करना? –

+0

@JamesAdkison: एक अस्थायी वस्तु होगी, और संदर्भ उस अस्थायी से बंधेगा। प्रतिलिपि को बढ़ाया जा सकता है (यदि परिणाम सीधे अस्थायी में बनाया जा सकता है)। –

+0

@BenVoigt हां, यह मेरा मुद्दा था (यानी, प्रतिलिपि बनाई जा सकती है)। –

8

स्थानीय चर के संदर्भ को लौटाना अवैध (अपरिभाषित व्यवहार) है। अवधि। const या mutable खंड नहीं है।

ऐसा इसलिए है क्योंकि स्थानीय फ़ंक्शन चर के स्वचालित संग्रहण अवधि होती है। समारोह समाप्त होने के बाद वे "नष्ट" हो जाते हैं। यदि फ़ंक्शन इस तरह के चर के संदर्भ में आता है, तो उस संदर्भ को इसे लटकने के लिए कहा जाता है: यह उस ऑब्जेक्ट को संदर्भित करता है जो अब मौजूद नहीं है।

पहला सी ++ नियम के कारण कानूनी है: prvalue के संदर्भ को प्रारंभ करने से संदर्भ के जीवनकाल में उस अस्थायी वस्तु का जीवनकाल बढ़ जाता है।

+0

नियम वास्तव में 'const' के साथ कुछ भी नहीं है - कोई भी संदर्भ जो * अस्थायी रूप से बाध्य है * अस्थायी के जीवनकाल को बढ़ाता है।सी ++ 98 में, अन्य नियमों ने प्रदान किया कि केवल कॉन्स संदर्भ सीधे अस्थायी रूप से बाध्य हो सकते हैं, वे नियम अब बदल गए हैं, जिनका जीवनकाल विस्तार नियम पर डोमिनोज़ प्रभाव पड़ा। –

+0

@BenVoigt यह पहली बात है जो मैंने सुना है। क्या आप एक संदर्भ प्रदान कर सकते हैं? – bolov

+0

देखें http://stackoverflow.com/a/3716360/103167 –

1

सबसे अधिक संभावना है क्योंकि यह पूरे स्टैक आधारित कॉलिंग सम्मेलनों को पूरी तरह से बर्बाद कर देगा जो हमें दशकों से अच्छी तरह से सेवा प्रदान करता है ... कि हर सीपीयू का मानना ​​बहुत अधिक है।

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