दिलचस्प पोस्ट
YouTube लाइव प्रसारण के दौरान 'चैट' बॉक्स के माध्यम से दर्ज की गई टिप्पणियों की फ़ीड कैसे प्राप्त करें? सीएसएस में एक डिवेल केंद्र AngularJS और कॉलिंग एमवीसी एपीआई का उपयोग कर फ़ाइल कैसे डाउनलोड करें? एक कर्ल कॉल के माध्यम से एक HTTP अनुरोध का उपयोग कर हेडर कैसे भेजना है? ASP.NET MVC – HTTP प्रमाणीकरण प्रॉम्प्ट अज्ञात संशोधक '/' में …? यह क्या है? गैर कोणीयोज़ वेबसाइट पर प्रोट्रेक्टर का उपयोग कैसे करें? PHP – उपयोगकर्ता को फ़ाइल भेजें Android में सुरक्षित HTTP पोस्ट पारदर्शी नियंत्रण बनाना वितरण, दुर्गों, सेटअपटोल्टों और डिस्टुट 2 के बीच मतभेद? असंगत स्तंभ गिनती आयात के लिए SSIS कार्य? जावा में प्रतिबिंब के माध्यम से निजी विरासत वाले क्षेत्रों तक पहुंच यह निर्धारित करने के लिए कि क्या आज एनएसडीट है? यदि कोई तत्व एनिमेटेड हो रहा है तो मैं jQuery के साथ कैसे पता लगा सकता हूं?

क्या सी ++ 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; 

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