जोड़ा तत्व या कंटेनर सदस्य कार्यों में कंटेनर रिटर्निंग एक सुरक्षित तरीका में संभव नहीं है। एसटीएल कंटेनर ज्यादातर "मजबूत गारंटी" प्रदान करते हैं। छेड़छाड़ किए गए तत्व या कंटेनर को लौटने से मजबूत गारंटी प्रदान करना असंभव हो जाएगा (यह केवल "मूल गारंटी" प्रदान करेगा)। Exception-Safety in Generic Components पर बूस्ट की वेबसाइट पर इन शर्तों का एक स्पष्टीकरण प्रदान किया गया है। Boost's website से नीचे देखें।
- बुनियादी गारंटी: कि घटक के अपरिवर्तनशीलताओं संरक्षित कर रहे हैं, और कोई संसाधन लीक कर रहे हैं।
- मजबूत गारंटी: किया है कि आपरेशन या तो सफलतापूर्वक पूरा कर लिया या एक अपवाद फेंका, कार्यक्रम राज्य बिल्कुल के रूप में यह पहले था आपरेशन शुरू कर दिया हो जाता है।
- नहीं फेंक गारंटी: कि आपरेशन एक अपवाद फेंक नहीं होंगे।
विषय पर वापस इस previous SO answer के अनुसार, इसके पीछे कारण यह है, कि कुछ लौटने संभवतः एक कॉपी-निर्माता है, जो एक अपवाद फेंक कर सकते हैं आह्वान सकता। लेकिन समारोह पहले से ही बाहर निकला है, इसलिए यह अपने मुख्य कार्य को सफलतापूर्वक पूरा कर चुका है, लेकिन फिर भी एक अपवाद फेंक दिया, जो मजबूत गारंटी का उल्लंघन है। आप शायद सोचें: "ठीक है तो संदर्भ द्वारा वापस आते हैं!", जबकि यह एक अच्छा समाधान की तरह लगता है, यह पूरी तरह से सुरक्षित नहीं है। उदाहरण निम्नलिखित पर विचार करें:
MyClass bar = myvector.push_back(functionReturningMyClass()); // imagine push_back returns MyClass&
फिर भी, यदि कॉपी-असाइनमेंट ऑपरेटर फेंकता है, हम अगर push_back सफल रहा या नहीं, इस प्रकार परोक्ष रूप से मजबूत गारंटी का उल्लंघन पता नहीं है। भले ही यह प्रत्यक्ष उल्लंघन नहीं है। बेशक MyClass& bar = //...
बजाय का उपयोग कर इस समस्या को हल होगा, लेकिन यह काफी असुविधाजनक हो सकता है, कि एक कंटेनर एक अनिश्चित स्थिति में मिल सकता है, सिर्फ इसलिए कि किसी को एक & भूल गया।
इस तथ्य के पीछे एक समान तर्क है कि std::stack::pop()
पॉप किए गए मान को वापस नहीं करता है। इसके बजाय top(
) शीर्षतम मूल्य को सुरक्षित तरीके से लौटाता है। शीर्ष पर कॉल करने के बाद, जब एक कॉपी-कन्स्ट्रक्टर, या एक कॉपी-असाइनमेंट कन्स्ट्रक्टर फेंकता है, तब भी आप जानते हैं कि स्टैक अपरिवर्तित है।
स्रोत
2011-08-18 14:58:33
"उदाहरण के लिए"? आपको क्या लगता है "उदा।" माध्यम? यदि विदेशी शब्द भ्रमित हैं, तो "उदाहरण के लिए" और "एक और उदाहरण" में क्यों न केवल अंग्रेजी का उपयोग करें? –
मुझे प्रश्न बहुत अस्पष्ट लगता है। "यदि सभी एसटीएल कंटेनर संदर्भ द्वारा वापस आते हैं" - इसका क्या मतलब है? सबसे पहले, आपको शायद "मानक पुस्तकालय कंटेनर" कहना चाहिए। दूसरा, कौन लौट रहा है? क्या आपके पास सदस्य कार्यों का एक विशिष्ट सेट दिमाग में है? या आप सदस्य कार्यों के बारे में पूछ रहे हैं जो * संदर्भ द्वारा वापस नहीं आते हैं? ('Pop_back()' की तरह?) –
@ केरेक: मैंने उदा। "उदाहरण के लिए" के रूप में अनावश्यक था। भावी आगंतुकों के लिए: http://ancienthistory.about.com/od/abbreviations/f/ievseg.htm –