अद्यतन कोड में प्रारंभकर्ता सूचियों के साथ कक्षाओं को पुन: स्थापित करना ऐसा कुछ है जो ऐसा लगता है कि ऐसा होना आम बात होगी। इसलिए लोग कक्षा के अपडेट होने से पहले मौजूदा रचनाकारों के लिए {} वाक्यविन्यास का उपयोग शुरू करते हैं, और हम स्वचालित रूप से किसी भी पुराने उपयोग को पकड़ना चाहते हैं, विशेष रूप से उन टेम्पलेट्स में उपयोग किए जाते हैं जहां उन्हें अनदेखा किया जा सकता है।
यदि मेरे पास वेक्टर जैसे वर्ग थे, जो आकार लेते थे, तो तर्कसंगत रूप से {} वाक्यविन्यास का उपयोग करके "गलत" होता है, लेकिन संक्रमण के लिए हम वैसे भी इसे पकड़ना चाहते हैं। C c1 {val}
का निर्माण करना संग्रह के लिए कुछ (एक, इस मामले में) मान लेना है, और C c2 (arg)
का मतलब कक्षा के लिए मेटाडेटा के वर्णनात्मक टुकड़े के रूप में वैल का उपयोग करना है।
दोनों उपयोगों का समर्थन करने के लिए, जब तत्व का प्रकार वर्णनात्मक तर्क के साथ संगत होता है, तो C c2 {arg}
का उपयोग करने वाला कोड अर्थ बदल जाएगा। ऐसा लगता है कि अगर हम अलग-अलग अर्थों के साथ दोनों रूपों का समर्थन करना चाहते हैं तो उस मामले में इसके आसपास कोई रास्ता नहीं है।
तो मैं क्या करूँगा? यदि संकलक को कोई चेतावनी जारी करने का कोई तरीका प्रदान करता है, तो मैं एक तर्क के साथ प्रारंभकर्ता सूची को चेतावनी देता हूं। यह मुश्किल लगता है कि संकलक विशिष्ट का उल्लेख न करें, इसलिए मैं इसके लिए एक सामान्य टेम्पलेट बनाउंगा, अगर यह बूस्ट में पहले से नहीं है, और इसके उपयोग को बढ़ावा देता है।
कंटेनर के अलावा, अन्य स्थितियों में प्रारंभिक सूची और एकल तर्क रचनाकारों के साथ अलग-अलग अर्थ होंगे जहां एकल तर्क सूची के साथ आप जो भी उपयोग करेंगे, उससे बहुत अलग प्रकार का कुछ नहीं है? गैर-कंटेनरों के लिए, यह ध्यान देने योग्य हो सकता है कि वे भ्रमित नहीं होंगे क्योंकि प्रकार अलग हैं या सूची में हमेशा कई तत्व होंगे। लेकिन इसके बारे में सोचना अच्छा है और अगर वे इस तरह से भ्रमित हो सकते हैं तो अतिरिक्त कदम उठाएं।
प्रारंभकर्ताइज़र सूची सुविधाओं के साथ एक गैर-कंटेनर को बढ़ाया जा रहा है, तो यह विशेष रूप से एक-तर्क निर्माता को डिजाइन करने से बचने के लिए पर्याप्त हो सकता है जिसे गलत किया जा सकता है। इसलिए, एक-तर्क कन्स्ट्रक्टर को अद्यतन कक्षा में हटा दिया जाएगा, या प्रारंभकर्ता सूची को पहले (संभावित रूप से टैग) तर्कों की आवश्यकता होगी। यही है, कोड समीक्षा पर पाई-इन-फेस के दंड के तहत ऐसा न करें।
कंटेनर जैसी कक्षाओं के लिए भी, एक कक्षा जो मानक पुस्तकालय वर्ग नहीं है, यह लागू कर सकती है कि एक-तर्क कन्स्ट्रक्टर फॉर्म अब उपलब्ध नहीं है। जैसे C c3 (size);
को C c3 (size, C());
के रूप में लिखा जाना होगा या एक गणना तर्क भी लेने के लिए डिज़ाइन किया जाना चाहिए, जो कि एक मान बनाम आरक्षित आकार में प्रारंभ करने के लिए आसान है, ताकि आप तर्क दे सकें कि यह एक सुविधा है और आरक्षित करने के लिए एक अलग कॉल के साथ शुरू होने वाला कोड इंगित करता है । तो फिर, ऐसा न करें अगर मैं उचित रूप से इससे बच सकता हूं।
कुछ लोग इस और अन्य कारणों से इसकी अनुशंसा नहीं करते हैं। (बीटीडब्ल्यू, आप सही हैं कि 'intializer_list' ctor को प्राथमिकता दी जाएगी।) – dyp
@dyp लेकिन फिर मुझे आश्चर्य है, क्या बात है? ब्रेस-इनिट सिंटैक्स का उपयोग करने के लिए सबसे अधिक परेशान पार्स और संकुचन रोकथाम बहुत अच्छे कारण हैं। लेकिन अब मुझे एक परेशानी या किसी अन्य को चुनना है? –
बिल्कुल। यह सभी प्रारंभिकरणों के लिए एक वाक्यविन्यास बनाने का प्रयास रहा है, लेकिन प्रारंभिक रूप से किए जाने के कई तरीके होने पर जरूरी है कि इसमें कमी हो सकती है - एक असंबद्धता होनी चाहिए, और शायद यह सही नहीं हो सकता है। – dyp