2013-04-22 9 views
9

कस्टम आवंटक के साथ std::vector के लिए कन्स्ट्रक्टर क्यों ले जाएं, आवंटक के व्यवहार से noexcept() को कम नहीं करता है?क्यों वेक्टर के चाल ctor एक exexcept() को कम नहीं करता है?

यह इस वर्ग को घेरने वाले वर्ग की ओर जाता है (अन्य) वेक्टर जो सामान्यतः <algorithm> एस में स्थानांतरित किया जा सकता है। यहां तक ​​कि यदि अंतर्निहित प्रकार नेसिसरी आवश्यकताओं को पूरा करता है (MoveInsertable और DefaultInsertable)।

+0

क्योंकि ऐसे लोग हो सकते हैं जो एक चालक निर्माता –

+4

से फेंक सकते हैं क्या आप कुछ कोड प्रदान कर सकते हैं? मुझे समझ में नहीं आता कि आपका क्या मतलब है। "आवंटक के व्यवहार" के बारे में 'अस्वीकरण'? –

+0

कहें, "आवंटक के व्यवहार" का अर्थ है 'नोएक्ससेप्ट (आवंटक :: निर्माण (...))' और 'अस्वीकरण (आवंटक :: नष्ट (...))' पर कुछ बूलियन अभिव्यक्ति। – Orient

उत्तर

4

मुझे लगता है कि द्वारा "कस्टम संभाजक साथ std::vector के लिए निर्माता के लिए कदम" आप संभाजक विस्तारित कदम निर्माता मतलब यह निर्माता यानी:

vector(vector&& v, const allocator_type& a); 

मुख्य कारण यह है कि अगर v.get_allocator() != a तो निर्माता का आवंटन करना चाहिए अधिक स्मृति, जो bad_alloc फेंक सकता है। संकलित समय पर जानने का कोई तरीका नहीं है यदि किसी दिए गए प्रकार के दो आवंटक हमेशा बराबर की तुलना करेंगे या नहीं (मैंने इसे दोष के रूप में रिपोर्ट किया है, LWG 2108 देखें)।

एनबी। मानक को इस निर्माता याvector(vector&&)noexcept होने के लिए कन्स्ट्रक्टर की आवश्यकता नहीं है।

+0

इस मामले में, "मानक की आवश्यकता नहीं है" को "मानक अनुमति नहीं देता" के रूप में बहाल किया जा सकता है, सही? – mcmcc

+0

@ एमसीएमसीसी, नहीं, यह सही नहीं है। कार्यान्वयन को अपवाद विनिर्देशों को जोड़ने या कसने की अनुमति है, इसलिए यह आवंटन प्रकार के साथ विशेषज्ञता के लिए 'अस्वीकरण (सत्य)' जोड़ने के अनुरूप है जिसे हमेशा बराबर तुलना करने के लिए जाना जाता है (उदा। 'Std :: आवंटक') –

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