2011-01-18 15 views
7

this question में उपयोगकर्ता Happy Mittal उद्धरण खंड 12.2.5 स्टैंडर्ड की सी ++ 03: एक निर्माता के ctor-प्रारंभकर्ता (12.6.2) में एक संदर्भ सदस्य के लिए एक अस्थायी बाध्य जब तक निर्माता बाहर निकालता है बनी हुई है।सी ++ मानक में सदस्य जीवनकाल कथन के लिए अस्थायी बाध्यता का बिंदु क्या है?

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

बाहरी ऑब्जेक्ट के पूरे जीवनकाल के लिए अभी भी एक खतरनाक संदर्भ है तो अस्थायी जीवनकाल निर्दिष्ट करने का क्या मतलब है? इस व्यवहार में कौन सा परिदृश्य उपयोगी हो सकता है?

+1

मैं खुद से एक ही प्रश्न पूछ रहा था। ध्यान दें कि 12.2 [वर्ग। समकालीन] नोट में शब्द C++ 0x FCD (n3225) में अपरिवर्तित है 5. –

उत्तर

7

किसी संदर्भ वस्तु को मृत वस्तु से बंधना उपयोगी नहीं है, लेकिन यह स्पष्ट होना उपयोगी है कि किसी संदर्भ में बाध्य होने पर "सामान्य" अस्थायी जीवनकाल विस्तार इस मामले में लागू नहीं होता है।

यह अस्थायी जीवनकाल विस्तार भी निर्दिष्ट करता है जो विशेष रूप से सीटीओ प्रारंभकर्ता में लागू होता है: यह सीटीओआर शरीर के निष्पादन से पहले मरने के बजाए सीटीओ के अंत तक बढ़ा दिया जाता है। यह "चालाक" वर्गों को छोड़कर उपयोगी नहीं होगा जिसका पूरा बिंदु सीटीओ निष्पादित कर रहा है, और इस प्रकार के (एबी) उपयोग को सही ढंग से टाला जाता है।

मुझे बाद के किसी भी वास्तविक दुनिया के उदाहरणों के बारे में पता नहीं है, लेकिन यह मुझे खतरे में डाल देता है क्योंकि डिफ़ॉल्ट रूप से विनाशकारी वर्गों को उनके जीवनकाल में "चालाक" और उनका उपयोग कैसे किया जाता था। C++ 0x में dtors के डिफ़ॉल्ट semantics को संभालने के तरीके के बारे में चर्चाओं में इस वास्तविक दुनिया का उपयोग और came up था।

+0

उस लिंक में अच्छी सामग्री! +1 – jweyrich

2

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

struct S { 
    Args const &r; 
    A a; 
    B b; 
    S(args....) 
    : r(expensive_func(args....)), a(r.for_a), b(r.for_b) {} 
}; 
+1

संदर्भ सदस्य से बचने के लिए प्रतिक्रिया दी गई और इसके परिणामस्वरूप प्रत्येक इंस्टेंस में ओवरहेड संभवतः: 'संरचना एसडी विवरण {ए; बी बी; एसडी विवरण (Args const & r): a (r.for_a), b (r.for_b) {}}; संरचना एस: निजी एसडीईटीएस {एस (/ * तर्क ... * /): एसडीईटीएस (महंगा_फनक (/ * तर्क ... * /)) {}}; ' –

+1

सी ++ 0x के साथ रिफैक्टरिंग भी आसान/बेहतर हो जाती है : 'संरचना एस {ए ए; बी बी; एस (/ * तर्क ... * /): एस (महंगा_फनक (/ * तर्क ... * /)) {} निजी: एस (Args const & r): a (r.for_a), बी (r.for_b) {}}; ' –

+0

तो, दूसरे शब्दों में, हालांकि मुझे पता है कि प्रारंभिकरण को कभी-कभी C++ 03 में वर्कअराउंड की आवश्यकता होती है, मैं कभी भी संदर्भ सदस्य का उपयोग नहीं करता। –

1

यह संकलक लेखकों के लिए उपयोगी है। एक दायरे के अंत में बाध्य अस्थायी को नष्ट करने के लिए उनके पास पहले से ही तर्क है, और कन्स्ट्रक्टर के बाहर निकलने का एक ऐसा बिंदु है। इस नियम के साथ संकलक इस तरह के अस्थायी को नष्ट करने के लिए उस बिंदु का पुन: उपयोग कर सकते हैं।

ध्यान दें कि मानक वास्तव में कुछ जीवनकाल पर निर्णय लेना चाहिए, और एकमात्र अन्य उचित बिंदु सीटीओ प्रारंभकर्ता सूची के बाद होगा लेकिन सीटीआर बॉडी से पहले। यह एक बिंदु नहीं है जहां अस्थायी अन्यथा नष्ट हो जाएंगे, और यह फ़ंक्शन-स्कोप try {} catch() ब्लॉक (जिसमें सीटीओ प्रारंभकर्ता सूची शामिल है) में हस्तक्षेप कर सकता है

+0

, ctor प्रारंभकर्ता पहले से ही एक पूर्ण अभिव्यक्ति के भीतर प्रत्येक प्रारंभ अभिव्यक्ति नहीं है, क्योंकि वे उपसूचक नहीं हैं एक और अभिव्यक्ति (सी ++ 03, §1.9 पी 12)? यदि ऐसा है, तो उन बिंदुओं पर अस्थायी वस्तु विनाश की आवश्यकता है। उदाहरण के लिए: 'स्ट्रक्चर ए {int foo, bar; एक(): foo (। टी() मीटर()), बार (। टी() मीटर()) {}}; 'संकलक लेखकों बस के रूप में आसानी से पुन: इस्तेमाल कर सकते हैं कि (बनाने compilers सरल समग्र) की कीमत पर "हमेशा मृत" संदर्भ सदस्यों की अनुमति देने वाली भाषा। –

+0

ठीक है, वह भी संभव हो गया होता। लेकिन क्या यह उपयोगी होगा? मैं सुझाव दूंगा कि इस तरह के डिजाइन के खतरे इसके लाभ से अधिक हैं। – MSalters

+0

मुद्दा यह है कि नहीं है? , वे निर्दिष्ट * कुछ * बजाय यह पूरी तरह से अस्पष्ट छोड़ insofar के रूप में छोड़कर सिर्फ एक वापसी बयान में temporaries करने के लिए बाध्य संदर्भ की तरह - संदर्भ जीवन-बढ़ाया temporaries के सदस्यों * वर्तमान में निर्दिष्ट किया गया है सहित उपयोगी * नहीं कर रहे हैं। –

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