2013-07-29 21 views
52

पर विचार करें:अजीब व्यवहार [भाग 1]

struct box 
{ 
    int array[3]; 
}; 

int main() 
{ 
    box a = {1}; 
} 

तो C++ ऊपर काम करता है तो क्यों नहीं देता है निम्न काम करता है?

struct box 
{ 
    int simple_int; 
}; 

int main() 
{ 
    box b = 2; 
} 

कारण क्या है?

उत्तर

84

ठीक तरह से, पूर्व box a = { { 1 } } का प्रयोग करेंगे, ताकि आप प्रत्येक कुल के लिए ब्रेसिज़ में से एक सेट है। ब्रेसिज़ का बाहरी सेट संरचना के लिए है, और आंतरिक सेट सरणी के लिए है। हालांकि, भाषा आपको आंतरिक ब्रेसिज़ को छोड़ने की अनुमति देती है।

बाद में, छोड़ने के लिए कोई भीतरी ब्रेसिज़ नहीं है। आपको बाहरी ब्रेसिज़ को छोड़ने की अनुमति नहीं है; कुल मिलाकर प्रारंभकर्ताओं की सूची को अलग करने के लिए आपके पास कम से कम एक सेट ब्रेसिज़ होना चाहिए। एक अर्थ में, ब्रेसिज़ कहते हैं, "यहां कुल चीज़ों को रखने के लिए चीजों की एक सूची दी गई है।" जब आप box b = 2 लिखते हैं, तो संकलक यह नहीं जानता कि आप को के अंदर कुल रखना चाहते हैं। इसके बजाए, ऐसा लगता है कि आप b ऑब्जेक्ट (इसके भाग के बजाए) को 2 पर प्रारंभ करने का प्रयास कर रहे हैं। इसलिए संकलक एक कन्स्ट्रक्टर या रूपांतरण खोजने की कोशिश करता है जो 2 को box में बदल देता है। जब यह विफल हो जाता है, तो आपको एक त्रुटि मिलती है।

+5

यहां तक ​​कि हमें int घोषित करने की अनुमति है: 'int i = {10};' –

+7

@GrijeshChauhan: मैंने छोड़ा क्योंकि यह प्रासंगिक नहीं है और चर्चा को जटिल बनाता है। सवाल यह है कि हम ब्रेसिज़ को क्यों नहीं छोड़ सकते हैं, हम उन्हें क्यों नहीं जोड़ सकते हैं। और यह स्केलरों के लिए एक विशेष मामला है कि भाषा विनिर्देश अलग-अलग व्यवहार करता है, न कि योगों के नियमों का एक हिस्सा। –

+2

धन्यवाद ग्रिजेश, मुझे यह नहीं पता था! –

17

यह काम नहीं करता है क्योंकि आपका वाक्यविन्यास गलत है। यदि आप यही चाहते हैं तो आप एक अंतर्निहित कन्स्ट्रक्टर के साथ बी = 2 के लिए समर्थन जोड़ सकते हैं।

box b = {2}; // correct syntax with no constructor 

या

struct box 
{ 
    // implicit constructor 
    box(int i) : i(i) {} 
    int i; 
}; 

box b(2); 
box c = 2; 

या

struct box 
{ 
    explicit box(int i) : i(i) {} 
    int i; 
}; 

box b(2); 
box c = 2; // disallowed 
+0

नील जिसे 'char * s = "ए" 'और' char * s = {"ए"} के समान छोड़ दिया गया है, दोनों संभव हैं। –

+1

@GrijeshChauhan: वास्तव में 'char * s =" ए "' C++ 11 में संभव नहीं है, अब और चेतावनी के बिना। आपको 'const' का उपयोग करना होगा। (स्ट्रिंग-शाब्दिक के लिए अच्छी तरह से 'char *' ** ** बहिष्कृत ** है, pedantic होने के लिए) – Nawaz

+1

@ नवाज़ दिलचस्प है इसलिए मुझे या तो करना है: 'const char * s = {" ए "}' या 'const char * s = "ए" 'सी ++ 11 ** में? ** –

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