2012-01-14 20 views
12

std::array<T> अनिवार्य रूप से struct में लिपटे एक सी-शैली सरणी है। struct के प्रारंभ में ब्रेसिज़ की आवश्यकता होती है, और सरणी के प्रारंभिकरण के लिए ब्रेसिज़ की आवश्यकता होती है।std :: array <T> प्रारंभिकरण

std::array<int, 5> a = {{1, 2, 3, 4, 5}}; 

लेकिन उदाहरण कोड मैंने देखा है की सबसे अधिक केवल ब्रेसिज़ की एक जोड़ी का उपयोग करता है:: तो मैं ब्रेसिज़ के दो जोड़े की जरूरत

std::array<int, 5> b = {1, 2, 3, 4, 5}; 

इस आना कैसे अनुमति दी है, और यह किसी भी लाभ है या पहले दृष्टिकोण की तुलना में कमियां?

+0

निर्दिष्ट करना होगा है ++ 11 ड्राफ्ट, या बस एक चेतावनी दें क्योंकि यह एक विस्तारित है जो खराब गठित कोड की अनुमति देता है। – ildjarn

+0

@ildjarn जोहान्स के अनुसार, इसकी अनुमति है। – fredoverflow

उत्तर

14

लाभ यह है कि आपके पास ... टाइप करने के लिए कम है। लेकिन दोष यह है कि घोषणा के दौरान आपको केवल ब्रेसिज़ छोड़ने की इजाजत है। यदि आप = को छोड़ देते हैं, या यदि सरणी सदस्य है और आप इसे member{{1, 2, 3, 4, 5}} से प्रारंभ करते हैं, तो आप केवल ब्रेसिज़ की एक जोड़ी नहीं पारित कर सकते हैं।

ऐसा इसलिए है क्योंकि f({{1, 2, 3, 4, 5}}) में ब्रेसिज़ को पारित होने पर संभव अधिभार अस्पष्टता की चिंताएं थीं। लेकिन इससे कुछ चर्चा हुई और एक मुद्दा रिपोर्ट उत्पन्न हुई है।

अनिवार्य रूप से, = { ... } प्रारंभ हमेशा ब्रेसिज़ छोड़ करने में सक्षम हो गया है,

int a[][2] = { 1, 2, 3, 4 }; 

कोई नई बात नहीं है कि के रूप में। संभवतः compilers कि कि कोड को स्वीकार एक पहले सी पर आधारित होते हैं - नया क्या है कि आप = छोड़ सकते हैं, लेकिन फिर आप मुझे यकीन है कि यह मानक द्वारा अनुमति _is_ नहीं कर रहा हूँ सब धनुकोष्ठक

int a[][2]{ {1, 2}, {3, 4} }; 
+0

क्या आप एक मानक उद्धरण प्रदान कर सकते हैं जो केवल ब्रेसिज़ की एक जोड़ी रखता है? – fredoverflow

+1

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1270 –

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