2011-11-19 16 views
46

जब तक मैं गलत कर रहा हूँ, यह एक एसटीडी बनाने के लिए संभव हो जाना चाहिए: इन तरीकों से सरणी:का उपयोग std :: प्रारंभ के साथ सरणी को सूचीबद्ध

std::array<std::string, 2> strings = { "a", "b" }; 
std::array<std::string, 2> strings({ "a", "b" }); 

और फिर भी, जीसीसी 4.6.1 का उपयोग कर रहा प्राप्त करने में असमर्थ हूँ इनमें से कोई भी काम करने के लिए। कंपाइलर बस कहता है:

expected primary-expression before ',' token 

और अभी तक प्रारंभिक सूचियां std :: vector के साथ ठीक काम करती हैं। तो यह कौन है? क्या मुझे लगता है कि std :: array को प्रारंभिक सूचियों को स्वीकार करना चाहिए, या जीएनयू मानक सी ++ लाइब्रेरी टीम गुम हो गई है?

+0

वह दुर्घटनाग्रस्त clang ... – Dani

+0

मुझे यकीन नहीं है कि यह काम करना चाहिए या नहीं (मैं 0x सामान पर अद्यतित नहीं हूं) लेकिन, बग या नहीं, मुझे लगता है कि ऐसा इसलिए है क्योंकि आप 'std का उपयोग कर रहे हैं: स्ट्रिंग अक्षर के साथ स्ट्रिंग'। क्या आपने स्ट्रिंग अक्षर को 'std :: string()' के साथ लपेटने का प्रयास किया है? –

+0

@ क्रिस: यह मैक ओएसएक्स 10.6 पर जीसीसी 4.6.1 के साथ मेरे लिए काम करता है। आप किस कंपाइलर विकल्प का उपयोग कर रहे हैं? – juanchopanza

उत्तर

72

std::array मजाकिया है। इसे मूल रूप से परिभाषित किया गया है:

template<typename T, int size> 
struct std::array 
{ 
    T a[size]; 
}; 

यह एक संरचना है जिसमें एक सरणी है। इसमें कोई कंस्ट्रक्टर नहीं है जो प्रारंभकर्ता सूची लेता है। लेकिन std::array सी ++ 11 के नियमों से कुल है, और इसलिए इसे कुल प्रारंभिकरण द्वारा बनाया जा सकता है।

std::array<std::string, 2> strings = {{ "a", "b" }}; 

नोट मानक सुझाव है कि कि अतिरिक्त ब्रेसिज़ इस मामले में elided जा सकता है: अंदर struct सरणी प्रारंभ कुल के लिए, आपको घुंघराले ब्रेसिज़ के एक दूसरे सेट की जरूरत है। तो यह संभवतः एक जीसीसी बग है।

+0

क्या मानक समिति इस उद्देश्य पर करती है? – Dani

+0

मानक के लिए मानक की आवश्यकता क्यों नहीं है कि 'std :: array' में एक निर्माता है जो प्रारंभकर्ता सूचियों के साथ काम करता है? –

+6

@ पॉलमंटा: क्योंकि तब यह कुल प्रारंभिकरण के लिए योग्य नहीं होगा। सरणी तत्वों के प्रकार (std :: स्ट्रिंग योग्य नहीं है) के आधार पर कुल प्रारंभिक संकलन समय में संकलित किया जा सकता है। प्रारंभकर्ता सूची प्रारंभिकरण * सरणी तत्वों के प्रकार के बावजूद * एक रनटाइम फ़ंक्शन कॉल होना चाहिए। –

9

स्वीकार किए जाते हैं जवाब देने के लिए जोड़ने के लिए:

std::array<char, 2> a1{'a', 'b'}; 
std::array<char, 2> a2 = {'a', 'b'}; 
std::array<char, 2> a3{{'a', 'b'}}; 
std::array<char, 2> a4 = {{'a', 'b'}}; 

जीसीसी 4.6.3 (Xubuntu 12.01) पर सभी काम करते हैं। हालांकि,

void f(std::array<char, 2> a) 
{ 
} 

//f({'a', 'b'}); //doesn't compile 
f({{'a', 'b'}}); 

उपरोक्त को संकलित करने के लिए डबल ब्रेसिज़ की आवश्यकता है। निम्न त्रुटि में एकल ब्रेसिज़ परिणामों के साथ संस्करण:

../src/main.cc: In function ‘int main(int, char**)’: 
../src/main.cc:23:17: error: could not convert ‘{'a', 'b'}’ from ‘<brace-enclosed initializer list>’ to ‘std::array<char, 2ul>’ 

मैं सुनिश्चित नहीं हूं प्रकार निष्कर्ष किस पहलू/रूपांतरण बातें इस तरह से काम करते हैं, या करता है तो यह जीसीसी के कार्यान्वयन के एक मोड़ है।

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