2013-04-06 17 views
9

मेरे आश्चर्य के लिए, मुझे एक गैर-प्रतिलिपि आवंटक के साथ std::vector::get_allocator() का उपयोग करने का प्रयास करते समय एक त्रुटि मिली। std::vector::get_allocator() क्यों मूल्य-दर-वापसी द्वारा संदर्भित नहीं करता है?std :: vector :: get_allocator() मूल्य-दर-वापसी क्यों करता है?

template<typename T> 
class nc_allocator { 
public: 
    using value_type = T; 

    nc_allocator(nc_allocator const&) = delete; 
    nc_allocator& operator=(nc_allocator const&) = delete; 

    // Other required members. 
}; 

std::vector<int, nc_allocator<int>> v; 
// boom: use of deleted function 
//   'nc_allocator<T>::nc_allocator(const nc_allocator<T>&) [with T = int]' 
v.get_allocator(); 
+2

मुझे संदेह है कि आवंटकों के उदाहरणों को हैंडल की तरह माना जाना चाहिए। इसका प्रमाण यह है कि दो आवंटकों को केवल तभी माना जाता है जब कोई अन्य वस्तुओं को हटा सकता है। –

उत्तर

7

मैं जब एक गैर copyable संभाजक साथ std::vector::get_allocator() का उपयोग करने के प्रयास में कोई त्रुटि हो गया।

मानक आपको ऐसा करने से मना करता है। 17.6.3.5 में आवंटन आवश्यकताओं का कहना है कि एक आवंटक प्रतिलिपि योग्य होगा।

X a1(a);   Shall not exit via an exception. 
       post: a1 == a 
X a1(move(a)); Shall not exit via an exception. 
       post: a1 equals the prior value 
       of a. 
तो मूल्य से लौट

एक संभाजक लौटने संभाजक आवश्यकताओं मानक द्वारा परिभाषित के विषय में की एक सही तरीका है।

मुझे यकीन नहीं है क्यों यह एक आवश्यकता है, लेकिन यदि गैर-लोकप्रिय आवंटकों की अनुमति दी गई है, तो खाली आधार अनुकूलन अब और काम नहीं करेगा।

+0

कड़ाई से यह कहकर केवल यह कहता है कि एक प्रतिलिपि अपवाद के माध्यम से बाहर नहीं निकल जाएगी; यह नहीं कहता कि यह संभव होना चाहिए। –

+2

यह कहता है कि यह अभिव्यक्ति मान्य होना चाहिए और यह अभिव्यक्ति बिल्कुल 'CopyConstructible' प्रकारों के समान ही है। यह भी मजबूत है क्योंकि प्रतिलिपि को अपवाद नहीं फेंकना चाहिए। – ipc

+0

यह क्रियात्मक पाठ से अधिक मजबूत नहीं है "सदस्य get_allocator() एक प्रतिलिपि देता है" –

1

मानक बस इतना तय:

[C++11: 23.2.1/7]:[..] सभी कंटेनर प्रकार इस खंड में परिभाषित किया गया है, सदस्य get_allocator() संभाजक कंटेनर के निर्माण के लिए प्रयोग किया जाता है या की एक प्रतिलिपि रिटर्न , अगर है कि संभाजक प्रतिस्थापित किया गया है, सबसे हाल ही प्रतिस्थापन की एक प्रति [..]

मुझे लगता है @ वॉन की अपनी परिकल्पना में सही है कि allocators यू के लिए हैं "हैंडल" के रूप में sed।

बहुत ढीले समानता, क्या आप कभी भी मानक एल्गोरिदम के साथ उपयोग के लिए एक गैर-प्रतिलिपि बनाने वाला फ़ंक्शन लिखेंगे?

+4

लेकिन मानक ऐसा क्यों कहता है? –

+0

@Zoidberg: क्योंकि किसी ने फैसला किया कि यह आवश्यक है। वाई संपत्ति के साथ एक्स क्यों बनाया गया था, इस बारे में तर्कसंगत बनाने की कोशिश करना स्टैक ओवरफ़्लो पर गैर रचनात्मक और ऑफ-विषय दोनों है। –

+0

मानक के इस हिस्से को कैसे किया जाता है "यदि वह आवंटन बदल दिया गया है"? –

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