कोड:std :: vector और std :: array के लिए C++ प्रारंभकर्ता_सूची व्यवहार अलग क्यों है?
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
मैं std :: सरणी के लिए डबल घुंघराले ब्रेसिज़ आवश्यकता क्यों है?
कोड:std :: vector और std :: array के लिए C++ प्रारंभकर्ता_सूची व्यवहार अलग क्यों है?
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
मैं std :: सरणी के लिए डबल घुंघराले ब्रेसिज़ आवश्यकता क्यों है?
std::array<T, N>
कुल मिलाकर है: इसमें कोई उपयोगकर्ता द्वारा घोषित कन्स्ट्रक्टर नहीं हैं, यहां तक कि कोई भी std::initializer_list
नहीं ले रहा है। ब्रेसिज़ का उपयोग कर प्रारंभ कुल प्रारंभ, सी ++ की एक विशेषता यह है कि सी
कुल प्रारंभ की "पुरानी शैली" से विरासत में मिला था का उपयोग किया =
का उपयोग करता है: कुल का यह पुरानी शैली के साथ
std::array<int, 4> y = { { 1, 2, 3, 4 } };
प्रारंभ, अतिरिक्त ब्रेसिज़ elided किया जा सकता है, तो यह के बराबर है: प्रपत्रकी घोषणा में
std::array<int, 4> y = { 1, 2, 3, 4 };
हालांकि, इन अतिरिक्त ब्रेसिज़ केवल elided जा सकता है ""(सी ++ 11 §8.5.1/11), यानी, जब पुरानी शैली =
का उपयोग किया जाता है। यह नियम सीधे सूची प्रारंभिकरण के लिए लागू नहीं होता है। यहां एक फुटनोट पढ़ता है: "सूची-प्रारंभिकरण के अन्य उपयोगों में ब्रेसिज़ को elided नहीं किया जा सकता है।"
इस प्रतिबंध से संबंधित एक दोष रिपोर्ट है: CWG defect #1270। प्रस्तावित संकल्प को अपनाया जाता है, तो ब्रेस इलिजन सूची आरंभीकरण के अन्य रूपों के लिए अनुमति दी हो जाएगा, और निम्नलिखित अच्छी तरह से गठित किया जाएगा: (। Hat टिप विल Voutilainen को दोष रिपोर्ट को खोजने के लिए)
std::array<int, 4> y{ 1, 2, 3, 4 };
क्योंकि std::vector
, एक निर्माता है कि एक std::initializer_list<T>
में ले जाता है प्रदान करता है, जबकि std::array
कोई कंस्ट्रक्टर्स है और {1, 2, 3, 4}
braced init-सूची एक std::initializer_list
के रूप में नहीं व्याख्या वास्तव में है, लेकिन std::array
के भीतरी सी शैली सरणी के लिए कुल प्रारंभ (कि जहां है ब्रेसिज़ का दूसरा सेट आता है: std::array
के लिए एक, वें के लिए एक ई आंतरिक सी-शैली सदस्य सरणी)।
वाह, मुझे मिल गया, धन्यवाद :) – Sungmin
क्या आपको वास्तव में 'std :: array' के लिए ब्रेसिज़ के दूसरे सेट की आवश्यकता है, या क्या आपको बस चेतावनी मिल रही है? 'std :: array y {1,2,3,4}; 'मेरे लिए काम करता है। –
bames53
@ bames53: जीसीसी इसे संकलित करने में गलत है। – Xeo
@Xeo: चेतावनी के साथ एक बीमार गठित कार्यक्रम को संकलित करने के लिए यह "गलत" नहीं है। –