दिलचस्प पोस्ट
कैश से उपयोग करने के लिए एंड्रॉइड ने वॉली सेट की Android में रिंगटोन / अलार्म ध्वनि कैसे खेलें आईओएस आवेदन के अधिकतम आकार LINQ: संग्रह में सभी ऑब्जेक्ट की संपत्ति पर मैक्स () कैसे करें और ऑब्जेक्ट को अधिकतम मान के साथ वापस लाएं नियमित अभिव्यक्ति पैटर्न स्ट्रिंग में कहीं भी मेल नहीं खाता स्विफ्ट में एल्ग्स की चर संख्या के साथ किसी फ़ंक्शन के सरणी को पास करना वेब संग्रह के वेब-एनएफ़ निर्देशिका से एक संसाधन कैसे लोड करें जावा एंड्रॉइड से बाह्य आईपी को कैसे पिंग करें जीआईटी क्लोन के बाद सीधे संशोधित फाइलें कॉलम संख्या को अक्षर में कनवर्ट करने के लिए फ़ंक्शन? पैरामीटर के साथ सजावटी? Java में एक सरणी का डिफ़ॉल्ट आरम्भिकरण क्या है? केवल अनाम चर अनजान वर्ग में उपलब्ध क्यों हैं? आईपैड उपयोगकर्ताओं का पता लगाने के लिए jQuery का उपयोग? मूल http फ़ाइल डाउनलोड करने और अजगर में डिस्क को सहेजना?

क्या सी ++ 11 सदिश <कॉन्स्ट टी> की अनुमति देता है?

कंटेनर आवश्यकताओं को सी ++ 03 से सी ++ 11 में बदल दिया गया है। जबकि सी ++ 03 में कंबल की आवश्यकता थी (जैसे कि वेक्टर के लिए प्रतिलिपि निर्माण और असाइनिब्यूबल), सी ++ 11 प्रत्येक कंटेनर ऑपरेशन (अनुभाग 23.2) पर सुक्ष्म आवश्यकताएं निर्धारित करता है।

नतीजतन, आप एक ऐसे प्रकार की दुकान कर सकते हैं जो प्रतिलिपि-रचनात्मक है लेकिन असाइन करने योग्य नहीं है – जैसे किसी सशक्त सदस्य के साथ एक संरचना के रूप में – जब तक कि आप केवल वे कुछ कार्य करते हैं जिन्हें असाइनमेंट की आवश्यकता नहीं होती है (निर्माण और push_back ऐसी हैं संचालन; insert नहीं है)।

मैं क्या सोच रहा हूं: क्या इसका मतलब यह है कि मानक अब vector<const T> अनुमति देता है? मुझे किसी भी कारण से यह नहीं दिखना चाहिए – const T , एक कॉन्स्ट सदस्य के साथ एक संरचना की तरह, एक प्रकार है जो प्रतिलिपि तैयार है, लेकिन असाइन नहीं किया गया है – लेकिन मैंने कुछ याद किया हो सकता है

(जो मुझे लगता है कि मुझे कुछ याद हो सकता है, इसका हिस्सा है, यह है कि जीसीसी ट्रंक क्रैश और जलता है अगर आप vector<const T> को इन्स्तांत करने की कोशिश करते हैं, लेकिन vector<T> साथ ठीक है vector<T> जहां टी में एक कॉन्स्ट सदस्य है)।

वेब के समाधान से एकत्रित समाधान "क्या सी ++ 11 सदिश <कॉन्स्ट टी> की अनुमति देता है?"

नहीं, मुझे विश्वास है कि आवंटन आवश्यकताओं का कहना है कि टी एक "गैर-कॉन्स्ट, गैर-संदर्भ वस्तु प्रकार" हो सकता है

आप लगातार ऑब्जेक्ट्स के वेक्टर के साथ बहुत कुछ करने में सक्षम नहीं होंगे। और एक const vector<T> वैसे भी लगभग वही हो जाएगा।

अद्यतन करें

स्वीकृत (और सही) उत्तर के तहत मैंने 2011 में टिप्पणी की:

निचली रेखा: हमने const T को const T करने के लिए डिज़ाइन नहीं किया था हालांकि मैंने इसे कुछ सोचा था और हम वास्तव में दुर्घटना से ऐसा करने के करीब आए। अपने ज्ञान का सबसे अच्छा करने के लिए, मौजूदा स्टिकिंग पॉइंट ओवरलोडेड address सदस्य फ़ंक्शंस की जोड़ी डिफ़ॉल्ट ऑलोकेटर में है: जब T const , तो इन दो अतिभारों में एक ही हस्ताक्षर होता है। इसे ठीक करने का एक आसान तरीका std::allocator<const T> को विशेषज्ञ करना होगा और ओवरलोड के किसी एक को हटा देगा।

आगामी सी ++ 17 मसौदे के साथ मुझे यह प्रतीत होता है कि हमने अब vector<const T> वैध किया है, और मेरा यह भी मानना ​​है कि हमने इसे गलती से किया है 🙂

P0174R0 std::allocator<T> से address अधिभार हटा देता है। P0174R0 इसके तर्क के हिस्से के रूप में std::allocator<const T> का समर्थन नहीं करता है

भूल सुधार

टीसी के नीचे की टिप्पणी में सही ढंग से नोट किया गया है कि address अधिभार हटाया गया है , हटाया नहीं गया है। मेरी गलती। पदावनत सदस्यों को 20.10.9 में नहीं दिखाया जाता है, जहां std::allocator परिभाषित किया गया है, लेकिन इसके बजाय उन्हें खंड D.9 में स्थानांतरित कर दिया गया है। मैंने इस संभावना को अध्याय डी को स्कैन करने के लिए उपेक्षित किया जब मैंने इसे पोस्ट किया था।

सुधार के लिए टीसी धन्यवाद। मैंने इस भ्रामक उत्तर को हटाने पर विचार किया, लेकिन शायद इस सुधार के साथ इसे छोड़ना सबसे अच्छा है, शायद यह किसी और व्यक्ति को उसी तरीके से गलत तरीके से पढ़ाएगा जैसा मैंने किया था।

हालांकि इस पर हमारे पास पहले से बहुत अच्छे उत्तर हैं, मैंने यह दिखाने के लिए अधिक व्यावहारिक उत्तर देने का फैसला किया कि क्या और क्या नहीं किया जा सकता है।

तो यह काम नहीं करता है:

 vector<const T> vec; 

बस दूसरे जवाबों को समझने के लिए क्यों पढ़ें और, जैसा कि आप अनुमान लगा सकते हैं, यह या तो काम नहीं करेगा:

 vector<const shared_ptr<T>> vec; 

T अब const नहीं है, लेकिन vector को shared_ptr vector है, एस T नहीं है

दूसरी ओर, यह काम करता है :

 vector<const T *> vec; vector<T const *> vec; // the same as above 

लेकिन इस मामले में, कोंट वस्तु है जिसे इंगित किया जा रहा है, पॉइंटेटर ही नहीं (जो कि वेक्टर स्टोर है)। यह समतुल्य होगा:

 vector<shared_ptr<const T>> vec; 

जो ठीक है

लेकिन अगर हम अभिव्यक्ति के समापन पर const करते हैं, तो यह सूचक को एक const में बदल देता है, इसलिए निम्न संकलन नहीं करेगा:

 vector<T * const> vec; 

थोड़ा भ्रमित, मैं सहमत हूँ, लेकिन आप इसे करने के लिए इस्तेमाल किया हो