2011-08-21 14 views
10

यह here कहा जाता है कि यह अपवाद विनिर्देश के कारण है। मैं यह नहीं समझता हूँ। क्या इस प्रश्न के अपवाद विनिर्देश के साथ कोई संबंध है?सी ++ में आवंटक को एक कॉपी कन्स्ट्रक्टर की आवश्यकता क्यों है?

उत्तर

10

ट्यूटोरियल के माध्यम से पढ़ने के बाद मैं शब्द से थोड़ा उलझन में था। लेकिन मेरा मानना ​​है कि यह इस रूप में सरल है: ट्यूटोरियल समझा था क्यों संभाजक के टेम्पलेट हैडर

allocator(const allocator&) throw();

और

template <class U> allocator(const allocator<U>&) throw();

भले ही प्रति निर्माता एक संभाजक के लिए काफी बेकार है पता चलता है। और जवाब यह था कि एक आवंटक का विनिर्देश निर्माता को अपवाद फेंकने की अनुमति नहीं देता है। इसलिए कॉपी कन्स्ट्रक्टर सार्वजनिक इंटरफ़ेस प्रतिलिपि बनाने वालों के साथ अपने स्वयं के आवंटक को प्राप्त करने से रोकने के लिए throw() (किसी अपवाद को फेंक नहीं देता) के अपवाद विनिर्देश के साथ कॉपी कन्स्ट्रक्टर को परिभाषित करता है जो अपवाद फेंक सकता है।

this link देखें कि एक अपवाद विनिर्देश क्या है जो आपको फेंक रहा था। (कोई पन इरादा नहीं है। वास्तव में)

तो, इसका मतलब यह नहीं था कि आवंटक बनाने के दौरान, आपको एक प्रतिलिपि प्रदान करना होगा। वे सिर्फ यह इंगित कर रहे थे कि विनिर्देश विशेष रूप से आपको किसी ऐसे अपवाद को फेंकने से रोकता है जो किसी अपवाद को फेंकता है। `

1

आवंटक को एक प्रतिलिपि बनाने की आवश्यकता होती है क्योंकि कंटेनरों की प्रतिलिपि बनाने वाला होता है और प्रक्रिया में उनके आवंटक की प्रतिलिपि बनाना होगा।

+1

सी ++ 11 से पहले, आवंटकों को अनिवार्य रूप से स्टेटलेस थे। नतीजतन डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करना पर्याप्त होगा।सी ++ 11 पोस्ट करें, चाहे किसी आवंटित परिस्थितियों में आवंटितकर्ताओं को उनके संलग्न कंटेनरों द्वारा प्रतिलिपि बनाई गई हो, आवंटकों 'select_on_container_X_Y' विधियों की उपस्थिति और परिभाषा द्वारा निर्धारित किया जाता है। [आवंटन लक्षण संदर्भ] देखें (http://en.cppreference.com/w/cpp/memory/allocator_traits) – apmccartney

4

आपको स्पष्ट रूप से एक कॉपी कन्स्ट्रक्टर (डिफ़ॉल्ट का उपयोग करने के बजाए) लिखना है क्योंकि एक C++ 03 आवंटक के लिए प्रतिलिपि को अपवाद विनिर्देशक throw() के साथ परिभाषित करने की आवश्यकता है। डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर में यह विनिर्देश नहीं है।

तकनीकी रूप से, आप पर नहीं हैं, लेकिन यदि यह अपवाद फेंकता है ... अच्छा, इसके साथ शुभकामनाएँ।

लेकिन यह केवल मामूली परेशानी है, क्योंकि सी ++ 03 में आवंटकों में राज्य नहीं हो सकता है। तो आपको आसपास के सदस्यों की प्रतिलिपि नहीं लेनी चाहिए। कॉपी कन्स्ट्रक्टर खाली हो सकता है।

+1

निकोल बोलस, यह ठीक होगा अगर आवंटक (कॉन्स्ट आवंटक और) = हटाएं ;? जैसा कि हम 2016 में हैं –

0

यह वास्तव में बहुत आसान है। एक आवंटक का उपयोग कर एक कंटेनर का कन्स्ट्रक्टर आवंटक लेता है और इसकी एक प्रति स्टोर करता है। ऐसा करने के लिए, इसे आवंटक को CopyConstructible होने की आवश्यकता है। बस इतना ही। ध्यान दें कि एक आवंटक प्रकार CopyAssignable तक आवश्यक नहीं है जब तक कि इसकी propagate_on_container_copy_assignment विशेषता सत्य न हो (जो दुर्लभ है)।

सी ++ 11 विनिर्देश यह भी कहता है कि "कोई भी कन्स्ट्रक्टर, तुलना ऑपरेटर, कॉपी ऑपरेशन, मूव ऑपरेशन या इन प्रकारों पर स्वैप ऑपरेशन अपवाद के माध्यम से बाहर निकल जाएगा।" अपवाद नियम आपको आवंटन की प्रतिलिपि बनाने के लिए एक आवंटन (विशेष रूप से निर्माण या विनाश के दौरान) की एक (ढेर) प्रतिलिपि बनाने की अनुमति देते हैं। डिजाइन करने वाले कंटेनर जो प्रतिलिपि, स्थानांतरित, स्वैप या तुलना में फेंकने वाले आवंटकों की उपस्थिति में अपवाद-सुरक्षित हैं, लगभग असंभव है। व्यावहारिक रूप से, एक आवंटक कुछ संसाधनों के लिए सूचक से अधिक नहीं पकड़ सकता है, इसलिए आवंटकों को प्रतिलिपि पर फेंकने की इजाजत देता है, वस्तुतः कोई लाभ नहीं होने के कारण बहुत दर्द होता है।

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