2012-07-09 44 views
60

कोड:std :: vector और std :: array के लिए C++ प्रारंभकर्ता_सूची व्यवहार अलग क्यों है?

std::vector<int> x{1,2,3,4}; 
std::array<int, 4> y{{1,2,3,4}}; 

मैं std :: सरणी के लिए डबल घुंघराले ब्रेसिज़ आवश्यकता क्यों है?

+1

क्या आपको वास्तव में 'std :: array' के लिए ब्रेसिज़ के दूसरे सेट की आवश्यकता है, या क्या आपको बस चेतावनी मिल रही है? 'std :: array y {1,2,3,4}; 'मेरे लिए काम करता है। – bames53

+3

@ bames53: जीसीसी इसे संकलित करने में गलत है। – Xeo

+10

@Xeo: चेतावनी के साथ एक बीमार गठित कार्यक्रम को संकलित करने के लिए यह "गलत" नहीं है। –

उत्तर

55

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 }; 

+2

मुझे यह नहीं पता था; अच्छा। – chris

+10

"वर्दी" प्रारंभिकरण के लिए बहुत कुछ ... – Mehrdad

+3

तो यह 'सरणी' के लिए प्रस्तुत अमूर्त मॉडल की विफलता है? –

23

क्योंकि std::vector, एक निर्माता है कि एक std::initializer_list<T> में ले जाता है प्रदान करता है, जबकि std::array कोई कंस्ट्रक्टर्स है और {1, 2, 3, 4} braced init-सूची एक std::initializer_list के रूप में नहीं व्याख्या वास्तव में है, लेकिन std::array के भीतरी सी शैली सरणी के लिए कुल प्रारंभ (कि जहां है ब्रेसिज़ का दूसरा सेट आता है: std::array के लिए एक, वें के लिए एक ई आंतरिक सी-शैली सदस्य सरणी)।

+0

वाह, मुझे मिल गया, धन्यवाद :) – Sungmin

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