यह here कहा जाता है कि यह अपवाद विनिर्देश के कारण है। मैं यह नहीं समझता हूँ। क्या इस प्रश्न के अपवाद विनिर्देश के साथ कोई संबंध है?सी ++ में आवंटक को एक कॉपी कन्स्ट्रक्टर की आवश्यकता क्यों है?
उत्तर
ट्यूटोरियल के माध्यम से पढ़ने के बाद मैं शब्द से थोड़ा उलझन में था। लेकिन मेरा मानना है कि यह इस रूप में सरल है: ट्यूटोरियल समझा था क्यों संभाजक के टेम्पलेट हैडर
allocator(const allocator&) throw();
और
template <class U> allocator(const allocator<U>&) throw();
भले ही प्रति निर्माता एक संभाजक के लिए काफी बेकार है पता चलता है। और जवाब यह था कि एक आवंटक का विनिर्देश निर्माता को अपवाद फेंकने की अनुमति नहीं देता है। इसलिए कॉपी कन्स्ट्रक्टर सार्वजनिक इंटरफ़ेस प्रतिलिपि बनाने वालों के साथ अपने स्वयं के आवंटक को प्राप्त करने से रोकने के लिए throw()
(किसी अपवाद को फेंक नहीं देता) के अपवाद विनिर्देश के साथ कॉपी कन्स्ट्रक्टर को परिभाषित करता है जो अपवाद फेंक सकता है।
this link देखें कि एक अपवाद विनिर्देश क्या है जो आपको फेंक रहा था। (कोई पन इरादा नहीं है। वास्तव में)
तो, इसका मतलब यह नहीं था कि आवंटक बनाने के दौरान, आपको एक प्रतिलिपि प्रदान करना होगा। वे सिर्फ यह इंगित कर रहे थे कि विनिर्देश विशेष रूप से आपको किसी ऐसे अपवाद को फेंकने से रोकता है जो किसी अपवाद को फेंकता है। `
आवंटक को एक प्रतिलिपि बनाने की आवश्यकता होती है क्योंकि कंटेनरों की प्रतिलिपि बनाने वाला होता है और प्रक्रिया में उनके आवंटक की प्रतिलिपि बनाना होगा।
आपको स्पष्ट रूप से एक कॉपी कन्स्ट्रक्टर (डिफ़ॉल्ट का उपयोग करने के बजाए) लिखना है क्योंकि एक C++ 03 आवंटक के लिए प्रतिलिपि को अपवाद विनिर्देशक throw()
के साथ परिभाषित करने की आवश्यकता है। डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर में यह विनिर्देश नहीं है।
तकनीकी रूप से, आप पर नहीं हैं, लेकिन यदि यह अपवाद फेंकता है ... अच्छा, इसके साथ शुभकामनाएँ।
लेकिन यह केवल मामूली परेशानी है, क्योंकि सी ++ 03 में आवंटकों में राज्य नहीं हो सकता है। तो आपको आसपास के सदस्यों की प्रतिलिपि नहीं लेनी चाहिए। कॉपी कन्स्ट्रक्टर खाली हो सकता है।
निकोल बोलस, यह ठीक होगा अगर आवंटक (कॉन्स्ट आवंटक और) = हटाएं ;? जैसा कि हम 2016 में हैं –
यह वास्तव में बहुत आसान है। एक आवंटक का उपयोग कर एक कंटेनर का कन्स्ट्रक्टर आवंटक लेता है और इसकी एक प्रति स्टोर करता है। ऐसा करने के लिए, इसे आवंटक को CopyConstructible
होने की आवश्यकता है। बस इतना ही। ध्यान दें कि एक आवंटक प्रकार CopyAssignable
तक आवश्यक नहीं है जब तक कि इसकी propagate_on_container_copy_assignment
विशेषता सत्य न हो (जो दुर्लभ है)।
सी ++ 11 विनिर्देश यह भी कहता है कि "कोई भी कन्स्ट्रक्टर, तुलना ऑपरेटर, कॉपी ऑपरेशन, मूव ऑपरेशन या इन प्रकारों पर स्वैप ऑपरेशन अपवाद के माध्यम से बाहर निकल जाएगा।" अपवाद नियम आपको आवंटन की प्रतिलिपि बनाने के लिए एक आवंटन (विशेष रूप से निर्माण या विनाश के दौरान) की एक (ढेर) प्रतिलिपि बनाने की अनुमति देते हैं। डिजाइन करने वाले कंटेनर जो प्रतिलिपि, स्थानांतरित, स्वैप या तुलना में फेंकने वाले आवंटकों की उपस्थिति में अपवाद-सुरक्षित हैं, लगभग असंभव है। व्यावहारिक रूप से, एक आवंटक कुछ संसाधनों के लिए सूचक से अधिक नहीं पकड़ सकता है, इसलिए आवंटकों को प्रतिलिपि पर फेंकने की इजाजत देता है, वस्तुतः कोई लाभ नहीं होने के कारण बहुत दर्द होता है।
- 1. कॉपी प्रारंभिकरण की तरह क्यों है? कॉपी कन्स्ट्रक्टर की आवश्यकता क्यों है?
- 2. कॉपी कन्स्ट्रक्टर सी ++ में डिफ़ॉल्ट कन्स्ट्रक्टर को क्यों छुपाता है?
- 3. सी ++ में एक कॉपी कन्स्ट्रक्टर क्या है?
- 4. सी # जेनेरिक कॉपी कन्स्ट्रक्टर
- 5. ऑब्जेक्ट जेनरेटर कॉल के आर-वैल्यू संदर्भ में कॉपी कन्स्ट्रक्टर की आवश्यकता क्यों होती है?
- 6. कोबजेक्ट की कॉपी कन्स्ट्रक्टर और असाइनमेंट को अक्षम क्यों करें
- 7. जावा में एक कॉपी कन्स्ट्रक्टर क्यों नहीं है?
- 8. सी # कॉपी कन्स्ट्रक्टर जनरेटर
- 9. कॉपी कन्स्ट्रक्टर यहां क्यों नहीं है?
- 10. कॉपी कन्स्ट्रक्टर
- 11. सी ++ में विनाशकों की आवश्यकता क्यों है?
- 12. क्या एक टेम्पलेटेड कन्स्ट्रक्टर सी ++ में अंतर्निहित कॉपी कन्स्ट्रक्टर को ओवरराइड करता है?
- 13. सी ++: कॉपी कन्स्ट्रक्टर और कॉपी असाइनमेंट ऑपरेटर को कार्यान्वित करना
- 14. बेस कॉपी कन्स्ट्रक्टर को
- 15. कन्स्ट्रक्टर या कॉपी कन्स्ट्रक्टर?
- 16. कन्स्ट्रक्टर, विनाशक और असाइनमेंट ऑपरेटर कॉपी करें। जब हमें उन सभी की आवश्यकता नहीं होती है?
- 17. कॉपी कन्स्ट्रक्टर और डिफॉल्ट कन्स्ट्रक्टर
- 18. कॉपी कन्स्ट्रक्टर
- 19. हमें संरचना की आवश्यकता क्यों है? (सी #)
- 20. सी ++ मानचित्र प्रकार तर्क को [] का उपयोग करते समय खाली कन्स्ट्रक्टर की आवश्यकता क्यों होती है?
- 21. हमें सी # प्रतिनिधियों की आवश्यकता क्यों है
- 22. कोई कॉपी कन्स्ट्रक्टर उपलब्ध नहीं है या कॉपी कन्स्ट्रक्टर को 'स्पष्ट' घोषित किया गया है
- 23. क्या जेएक्सबी को सार्वजनिक नो-एर्ग कन्स्ट्रक्टर की आवश्यकता है?
- 24. क्यों "{} \" की आवश्यकता है?
- 25. सी ++ में एक कॉपी कन्स्ट्रक्टर को प्रतिबंधित करने का सबसे विश्वसनीय तरीका क्या है?
- 26. टाइपफ़ोफ़ की आवश्यकता क्यों है?
- 27. मेरे सी ++ सबक्लास को एक स्पष्ट निर्माता की आवश्यकता क्यों है?
- 28. कॉपी-कन्स्ट्रक्टर विरासत
- 29. बाहरीकरण को कार्यान्वित करने के लिए एक डिफ़ॉल्ट सार्वजनिक कन्स्ट्रक्टर की आवश्यकता क्यों है?
- 30. हमें एक निजी निर्माता की आवश्यकता क्यों है?
सी ++ 11 से पहले, आवंटकों को अनिवार्य रूप से स्टेटलेस थे। नतीजतन डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करना पर्याप्त होगा।सी ++ 11 पोस्ट करें, चाहे किसी आवंटित परिस्थितियों में आवंटितकर्ताओं को उनके संलग्न कंटेनरों द्वारा प्रतिलिपि बनाई गई हो, आवंटकों 'select_on_container_X_Y' विधियों की उपस्थिति और परिभाषा द्वारा निर्धारित किया जाता है। [आवंटन लक्षण संदर्भ] देखें (http://en.cppreference.com/w/cpp/memory/allocator_traits) – apmccartney