2012-10-28 20 views
5

मैंने देखा कि std :: वेक्टर की इसकी elememt प्रकार टी पर आवश्यकताओं को C++ 03 से C++ 0x में बदल दिया गया है। टी को अब रचनात्मक प्रतिलिपि बनाने की आवश्यकता नहीं है, लेकिन रचनात्मकता पर्याप्तता को स्थानांतरित करें।क्या वेक्टर तत्वों को चलने की आवश्यकता है?

क्या यह टी के लिए आवश्यक है भले ही हम संभावित रूप से पुन: आवंटित न करें?

vector<boost::scoped_ptr<int>> x(numberElements); 

मुझे यहां एक कदम की आवश्यकता नहीं दिख रही है। विनिर्देश क्या कहता है?

+0

ठीक है, यह मानक द्वारा आवश्यक है ... भले ही आपका वास्तविक कार्यान्वयन स्थिर वस्तुओं के साथ ठीक काम कर सके। –

+0

@kerrek मुझे ऐसा लगता है कि यह 'नए' सरणी की तुलना में एक प्रमुख विशेषता हानि है। आवश्यकता के कारण क्या है? –

+0

आप "केवल एक बार" आवंटन के लिए हमेशा 'std :: unique_ptr पी (नया टी [एन])' प्राप्त कर सकते हैं। आवश्यकता मानक कंटेनर आवश्यकताओं का सिर्फ एक हिस्सा है ... मुझे नहीं पता * क्यों * इसमें अवधारणा को सरल रखने के अलावा अन्य विशेष अपवाद नहीं हैं। उदाहरण के लिए, आप अपने स्वयं के समाधान के रूप में सी ++ 11 में सटीक उसी जेनरेट कोड के लिए 'std :: vector >' का उपयोग कर सकते हैं, इसलिए यह वास्तव में किसी भी अर्थ में कम नहीं आ रहा है। –

उत्तर

3

23.3.6.2 [vector.cons] अनुच्छेद 4 के अनुसार आप जिस कंस्ट्रक्टर का उपयोग कर रहे हैं उसे DefaultInsertable की आवश्यकता है। चूंकि कन्स्ट्रक्टर आवश्यकता तालिका के लिए रचनाकारों में से एक नहीं है, इसलिए CopyInsertable के लिए भी पूछना कोई अतिरिक्त आवश्यकता नहीं होनी चाहिए। 23.2.1 के लिए [container.requirements.general] अनुच्छेद 13 के अनुसार, DefaultInsertable मतलब यह है कि निम्नलिखित अभिव्यक्ति अच्छी तरह से गठित किया गया है:

allocator_traits<A>::construct(m, p); 

ऐसा लगता है, इसका मतलब है कि इस सवाल का जवाब प्रयुक्त संभाजक A पर निर्भर करता है। मैं 20.6.7.2 [allocator.uses.construction] के गहन अर्थ का विश्लेषण करने के लिए काफी पसंद नहीं करता हूं। आइए प्रशिक्षक से बचें: यह निर्धारित करना कि इस पैराग्राफ का मतलब क्या है व्यायाम के रूप में छोड़ दिया गया है!

+0

+1 * इस कन्स्ट्रक्टर के लिए 'टी 'की केवल *' डिफ़ॉल्ट अनिवार्य' की आवश्यकता है। 'टी 'को' MoveConstructible 'और न ही' CopyConstructible' 'की आवश्यकता नहीं है। जब डिफ़ॉल्ट आवंटक का उपयोग किया जाता है, तो 'डिफ़ॉल्ट अनिश्चित' का अर्थ है 'डिफ़ॉल्ट कॉन्स्ट्रक्टेबल'। जोहान्स का कोड अनुरूप है (माना जाता है कि 'boost :: scoped_ptr ' दायरे में है और इसका मतलब है कि हम सभी का क्या अर्थ है)। –

+0

@ हावर्ड आह, स्पष्टीकरण के लिए धन्यवाद। अब मैं अपने कोड के बारे में चिंता किए बिना सो सकता हूं। –

+0

@ जोहान्सचैब-लिटब: मैंने कहा कि यह पोर्टेबल नहीं है। ;-) मुझे यकीन नहीं है कि इस समय इस पर कितने कार्यान्वयन सही हैं। मुझे पता है libC++ है। मुझे यह सुनने में दिलचस्पी होगी कि आपके उदाहरण के साथ अन्य कार्यान्वयन क्या काम करते हैं। –

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