मुख्य उपयोग जो मुझे finally
के लिए मिलेगा, सी कोड से निपटने के दौरान होगा, क्योंकि अन्य लोगों ने बताया कि सी संसाधन केवल कोड में एक या दो बार उपयोग किया जा सकता है और वास्तव में एक RAII- अनुरूप संरचना में लपेटने के लायक नहीं है। उस ने कहा, लैम्बडास के साथ, यह फ़ंक्शन में निर्दिष्ट फ़ंक्शन ऑब्जेक्ट का आह्वान करने वाले एक डॉटोर के माध्यम से कुछ कस्टम तर्क को केवल इतना आसान लगता है।
अन्य उपयोग केस जो मुझे मिलेगा वह विदेशी विविध कोड के लिए है, चाहे हम एक सामान्य या असाधारण निष्पादन पथ में हों, भले ही किसी टाइमस्टैम्प को मुद्रित करने या फ़ंक्शन से बाहर निकलने के बारे में कुछ भी न हो। यह इतना दुर्लभ मामला है कि मेरे लिए यह लगता है कि यह सिर्फ इसके लिए एक भाषा सुविधा रखने के लिए अधिक है, और अब इस उद्देश्य के लिए एक अलग वर्ग लिखने के बिना लैम्बदास के साथ अभी भी इतना आसान है।
अधिकांश भाग के लिए मुझे अब इसके लिए बहुत सीमित उपयोग के मामले मिलेंगे, जो वास्तव में भाषा में इतने बड़े बदलाव को उचित नहीं मानते हैं। मेरा छोटा पाइप सपना हालांकि किसी ऑब्जेक्ट के डॉटर के अंदर बताने का कोई तरीका है कि वस्तु को सामान्य निष्पादन पथ या असाधारण एक के माध्यम से नष्ट किया जा रहा है या नहीं।
जो स्कोप गार्ड को सरल बना देगा, अब commit/dismiss
को स्कोप गार्ड नष्ट होने पर स्वचालित रूप से वापस रोल किए बिना परिवर्तन स्वीकार करने के लिए कॉल करने की आवश्यकता होगी।
ScopeGuard guard(...);
// Cause external side effects.
...
// If we managed to reach this point without facing an exception,
// dismiss/commit the changes so that the guard won't undo them
// on destruction.
guard.dismiss();
बस इस बनने के लिए: विचार यह अनुमति है
ScopeGuard guard(...);
// Cause external side effects.
...
मैं हमेशा गुंजाइश अजीब के साथ ही त्रुटि प्रवण एक छोटा सा की रक्षा करता है खारिज करने के लिए की जरूरत मिल गया है, के बाद से मैंने कभी-कभी उन्हें खारिज करने के लिए भूल जाते हैं कि वे सभी बदलावों को पूर्ववत कर दें, मुझे एक पल के लिए अपने सिर को खरोंच कर रहा है, क्योंकि मेरा ऑपरेशन तब तक कुछ भी नहीं कर रहा था जब तक मुझे एहसास नहीं हुआ, "ओह, मैं स्कोप गार्ड को खारिज करना भूल गया।"। यह एक मामूली चीज है, लेकिन अधिकांशतः मुझे स्पष्ट स्कोप गार्ड बर्खास्तगी की आवश्यकता को खत्म करने के लिए यह और अधिक सुरुचिपूर्ण लगता है, जो संभवतः उनके विनाशकों के अंदर बता सकता है, चाहे वे सामान्य निष्पादन पथों के माध्यम से नष्ट हो जाएं (जिस पर वे इंगित करें कि दुष्प्रभावों को रखा जाना चाहिए) या असाधारण वाले (जिस बिंदु पर साइड इफेक्ट पूर्ववत किया जाना चाहिए)।
यह सबसे मामूली बात है लेकिन अपवाद के सबसे कठिन क्षेत्र में सुरक्षा प्राप्त करने के लिए सुरक्षा: बाहरी दुष्प्रभावों को वापस रोल करना। जब स्थानीय संसाधनों को ठीक से नष्ट करने की बात आती है तो मैं सी ++ से अधिक नहीं पूछ सकता था। यह उस उद्देश्य के लिए पहले से ही काफी आदर्श है। लेकिन बाहरी साइड इफेक्ट्स को वापस लेना हमेशा किसी भी भाषा में मुश्किल होता है जो उन्हें पहले स्थान पर होने की अनुमति देता है, और इस तरह की आसान बनाने के लिए किसी भी छोटी सी छोटी मदद से मैं हमेशा सराहना करता हूं।
आप दो अलग-अलग प्रश्न पूछ रहे हैं। शीर्षक पूछता है कि आखिरकार क्यों नहीं है, और वास्तविक पोस्ट उन मामलों के उदाहरण मांगता है जहां अंततः आरएआईआई से बेहतर होगा। मेरा सुझाव है कि आप उनमें से एक को संपादित करें, इसलिए वे वास्तव में मेल खाते हैं। यह उन लोगों के लिए भ्रमित है जो इस पोस्ट पर एक खोज में ठोकर खा रहे हैं। – jalf