2013-03-20 15 views
5

के रूप में संदर्भ संदर्भ यहां तक ​​कि यदि इस विषय पर कई बार चर्चा की गई थी, तो मुझे अपने विशेष मामले के बारे में एक निर्णायक स्पष्टीकरण नहीं मिल रहा है। constRefTest अस्थायी जीवनकाल का विस्तार करेगा? क्या नीचे दिया गया उदाहरण कानूनी है?कक्षा सदस्य

#include <iostream> 

class RefTest 
{ 
public: 
    RefTest(const std::string &input) : str(input) {} 
    ~RefTest() {std::cout << "RefTest" << std::endl;} 
private: 
    std::string str; 
}; 

class Child 
{ 
public: 
    Child (const RefTest &ref) : ref_m(ref) {} 
    ~Child() {std::cout << "Test" << std::endl;} 
private: 
    const RefTest &ref_m; 
}; 

class Test 
{ 
public: 
    Test() : child(RefTest("child")) {}//Will the temporary get destroyed here? 
    ~Test() {std::cout << "Test" << std::endl;} 
private: 
    const Child child; 
}; 

int main() 
{ 
    Test test; 
} 
+5

अंतिम पंक्ति बिल्कुल एक वस्तु नहीं बना रहा है यही कारण है कि । यह एक समारोह घोषित कर रहा है। Http://en.wikipedia.org/wiki/Most_vexing_parse देखें। –

+0

@ ओली क्रिसल्सवर्थ ओह, शूट। मैं डर गया था उदाहरण बेवकूफ है :(कृपया मेरी एक है, जो थोड़ा मेरे वास्तविक जीवन स्थिति। इस बार के करीब होना चाहिए, मैं वहाँ किसी भी अप्रिय पार्स मुद्दों होना चाहिए नहीं लगता कि अद्यतन किया गया। –

+0

@NayanaAdassuriya जो 'test2 'मैं अपने प्रारंभिक उदाहरण पुनर्लेखन, क्योंकि मैं इसे में पर्याप्त विचार करना नहीं था था। के –

उत्तर

5

संदर्भ नहीं जीवन का विस्तार करता है। कोड कानूनी है, लेकिन केवल इसलिए कि कन्स्ट्रक्टर खत्म होने के बाद आप कभी भी ref_m तक नहीं पहुंचते हैं।

अस्थायी कन्स्ट्रक्टर पैरामीटर, ref से जुड़ा हुआ है। बाद में ref_m, इसके लिए एक और संदर्भ बाध्यकारी, जीवन भर का विस्तार नहीं करता है। यदि ऐसा होता है, तो आपके पास स्टैक पर एक ऑब्जेक्ट होता है जिसे तब तक जारी रखना होता है जब तक संदर्भ सदस्य इसे बाध्य करता है, जिसे ढेर पर आवंटित किया जा सकता है, इसलिए जब कंस्ट्रक्टर लौटाता है तो संकलक ढेर को खोलने में असमर्थ होगा।

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

+0

ओह, खूनी नरक। यह मेरे लिए नहीं हुआ कि यह बाध्य होगा समारोह पैरामीटर के बजाय आंतरिक सदस्य। उनका कहना है कि बाहर के लिए धन्यवाद। –

+0

यहां तक ​​कि अगर आप बच्चे को निर्माता जैसे 'ref_m में एक अस्थायी बनाने (RefTest (" "))' तो यह जीवन अंत अतीत का विस्तार नहीं होगा कन्स्ट्रक्टर के, उसी कारण से अस्थायी कन्स्ट्रक्टर के स्टैक फ्रेम में है और जब वह फ़ंक्शन लौटाता है तो उसे नष्ट करना होगा। मानक स्पष्ट रूप से कहता है: "कन्स्ट्रक्टर के सीटीओ-प्रारंभकर्ता (12.6.2) में किसी संदर्भ सदस्य के लिए अस्थायी बाध्यता तब तक बनी रहती है जब तक कि निर्माता बाहर निकलता न हो।" 12.2 [वर्ग। समकालीन] –

+0

दरअसल।तब मैंने अपने प्रश्न से संबंधित अधिकांश उत्तरों को भ्रामक बताया है। मैं इस धारणा के तहत था कि यदि मैं ** कॉन्स ** संदर्भ में अस्थायी असाइन करता हूं, तो संदर्भ केवल तभी समाप्त हो जाएगा जब संदर्भ दायरे से बाहर हो जाता है, न कि अस्थायी। –

3

सी ++ मानक कहता है:

दूसरा संदर्भ जब एक संदर्भ के लिए एक अस्थायी करने के लिए बाध्य किया जाता है। अस्थायी जिस पर संदर्भ बाध्य है या अस्थायी है जो अस्थायी है अस्थायी है, संदर्भ के जीवनकाल के लिए जारी है जैसा कि नीचे निर्दिष्ट है, अस्थायी है। कन्स्ट्रक्टर के सीटीओआर-प्रारंभकर्ता (12.6.2) में एक संदर्भ सदस्य के लिए एक अस्थायी बाध्य कन्स्ट्रक्टर बाहर निकलने तक जारी रहता है। ए फ़ंक्शन कॉल में एक संदर्भ पैरामीटर के लिए अस्थायी बाध्य (5.2.2) कॉल वाली पूर्ण अभिव्यक्ति को पूरा होने तक जारी रहता है।

नोट: और वैसे, इस नकली (1, 2), तो आप बेहतर, अगली बार जब खोज करनी चाहिए है ... :)

+0

हां, अब यह स्पष्ट है। मानक से उद्धरण के लिए धन्यवाद। –

+0

संपादन में संदर्भों के लिए धन्यवाद। इस विषय पर यहां बहुत सारे प्रश्न हैं और अब मैं समझ सकता हूं कि क्यों ... उनमें से अधिकांश ने मुझे यह धारणा दी है कि एक कॉन्स्ट्रेंस को अस्थायी रूप से निर्दिष्ट करने से संदर्भ तब तक बढ़ जाएगा जब तक कि संदर्भ दायरे से बाहर न हो जाए। –

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