क्या auto_ptr पदावनत हो गया है?


83
  1. क्या Auto_ptr को आने वाले C ++ मानक में अपदस्थ किया जाएगा?
  2. क्या यूनिक_ टीपी को शेयर ट्रांसफर के बजाय स्वामित्व हस्तांतरण के लिए इस्तेमाल किया जाना चाहिए?
  3. यदि Unique_ptr मानक में नहीं है, तो क्या मुझे इसके बजाय साझा_ptr का उपयोग करने की आवश्यकता है?

जवाबों:


80

अद्यतन: यह उत्तर २०१० में लिखा गया था और जैसा कि प्रत्याशित std::auto_ptrकिया गया है। सलाह पूरी तरह से मान्य है।

C ++ में 0x के std::auto_ptrपक्ष में पदावनत किया जाएगा std::unique_ptr। स्मार्ट पॉइंटर की पसंद आपके उपयोग के मामले और आपकी आवश्यकताओं पर निर्भर करेगी, std::unique_ptrएकल स्वामित्व के लिए चालित शब्दार्थ के साथ जो कंटेनरों के अंदर उपयोग किया जा सकता है (चाल शब्दार्थ का उपयोग करके) और std::shared_ptrजब स्वामित्व साझा किया जाता है।

आपको स्मार्ट पॉइंटर का उपयोग करने की कोशिश करनी चाहिए जो स्थिति को सबसे अच्छी तरह से फिट करता है, सही पॉइंटर प्रकार का चयन करने से आपके डिजाइन में अंतर्दृष्टि के साथ अन्य प्रोग्रामर प्रदान करता है।


22

हां, आज के रूप auto_ptrमें C ++ 0x में पदावनत किया जाएगा और आपको unique_ptrइसके बजाय उपयोग करना चाहिए । नवीनतम ड्राफ्ट मानक (n3035) से, अनुभाग D.9

वर्ग टेम्पलेट auto_ptrको हटा दिया गया है। [नोट: वर्ग टेम्पलेट unique_ptr(२०.९ १०) एक बेहतर समाधान प्रदान करता है। ध्यान दें]

जब तक मानक की पुष्टि नहीं हो जाती, तब तक यह हमेशा संभव है कि समिति इस निर्णय को संशोधित करेगी, हालांकि मुझे लगता है कि इस निर्णय के लिए संभावना नहीं है।


18

इतना ही नहीं auto_ptrहटाई गई है सी ++ 11 में (D.10, पेज 1228) , यह भी हो जाएगा नष्ट कर दिया सेल्सियस के ++ उसे भावी संस्करण में :

N4190 अपनाया, और वास्तव में हटाया सी ++ सहित मानक पुस्तकालय, से (बस पदावनत नहीं) कई पुरातन बातें auto_ptr, bind1st/ bind2nd, ptr_fun/ mem_fun/ mem_fun_ref, random_shuffleऔर कुछ और। वे सभी अब C ++ 17 मानक लाइब्रेरी के मसौदे से हटा दिए गए हैं और भविष्य के पोर्टेबल C ++ का हिस्सा नहीं होंगे।

इसके बारे में एक और दस्तावेज़: प्रोग्रामिंग भाषा C ++, लाइब्रेरी इवोल्यूशन वर्किंग ग्रुप - दस्तावेज़ N4190 , यदि आप अधिक जानकारी चाहते हैं।

आप auto_ptrस्वचालित कोड का उपयोग करके किसी भी कोड को परिवर्तित कर सकते हैं , unique_ptrइसके बजाय उपयोग करके

जब भी "कॉपी" किया जा रहा था डाला के साथ किसी भी कोड का उपयोग करके auto_ptrयंत्रवत् रूप से परिवर्तित किया जा सकता है ।unique_ptrmove()auto_ptr


3

नहीं, यह पदावनत नहीं है। यह हो सकता है, अगर C ++ 0x कभी स्वीकार हो जाए। और यह वास्तविक रूप से हमेशा समर्थित होगा। मैं नहीं मानता कि किसी भी पदावनत विशेषता को कभी भी वास्तविक दुनिया C ++ कार्यान्वयन से हटा दिया गया है।


5
C ++ मानक को केवल एक बार अपडेट किया गया है, और यह मूल रूप से सिर्फ एक तकनीकी कोरिगेंडम था (यानी उन समस्याओं के लिए तय किया गया था जो उद्धृत की गई थीं) यह आश्चर्य की बात नहीं है कि यह कुछ भी नहीं हटाया। OTOH, पुरानी सुविधाओं को अंततः संकलक से हटा दिया जाता है। उदाहरण के लिए, शायद <iostream.h>पहले से अधिक C ++ का उपयोग किया गया था auto_ptr, लेकिन MS VC ++ (एक के लिए) अब इसे प्रदान नहीं करता है।
जेरी कॉफिन

1
@ जेरी आईस्ट्रीम।यह किसी भी मानक का हिस्सा नहीं रहा है। और इस तरह, यह पदावनत नहीं है।

@ नील: नहीं, लेकिन इसका बहुत उपयोग किया गया था । auto_ptrमानक का हिस्सा है, लेकिन काफी कम उपयोग किया जाता है। एक व्यावहारिक दृष्टिकोण से, इसके निष्कासन से काफी कम प्रभाव पड़ेगा।
जेरी कॉफिन

2
@ मेरी अच्छी तरह से मैं auto_ptr का बहुत उपयोग करता हूं, और iostream.h का उपयोग बिल्कुल नहीं करता। मुझे कभी-कभी लगता है कि C ++ मानक कॉमाइटे के पास अपने सामूहिक बोनट में मधुमक्खी का थोड़ा सा हिस्सा होता है, जब यह अपस्फीति की बात आती है। कुछ चीजें, जैसे मूल स्ट्रिंग स्ट्रीम स्पष्ट रूप से गलत थीं, लेकिन अन्य जैसे पूरी तरह से प्रयोग करने योग्य "स्थिर" कीवर्ड के बजाय नामहीन नामस्थान का उपयोग करने के विचार को पसंद करते हैं (और हैं) पूरी तरह से बोनर।

1
@ नील: ठीक है, चलो इसे परिप्रेक्ष्य में रखने की कोशिश करते हैं। आपके व्यक्तिगत रूप से मैं जो कुछ भी करता हूं, उसके बावजूद, "<iostream.h>" पैदावार के लिए एक Google खोज ~ 263'000 हिट करता है, और auto_ptr के समान करने से ~ 66'000 हिट मिलती है।
जेरी कॉफ़िन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.