सी ++ 11 में, ऐसा लगता है जैसे कि यह इस प्रकार एक std::map<std::string, int>
प्रारंभ करने में कानूनी है:कौन से भाषा नियम सी ++ 11 को कम करने के लिए अनुमति देते हैं कि यह जोड़े की प्रारंभकर्ता_सूची है?
std::map<std::string, int> myMap = {
{ "One", 1 },
{ "Two", 2 },
{ "Three", 3 }
};
Intuitively, इस समझ में आता है - ब्रेस संलग्न प्रारंभकर्ता तार के जोड़े की एक सूची है, और std::map<std::string, int>::value_type
std::pair<std::string, int>
है (संभवतः कुछ const
योग्यता के साथ।
हालांकि, मुझे यकीन नहीं है कि मैं समझता हूं कि टाइपिंग कैसे काम करती है। अगर हम यहां परिवर्तनीय घोषणा को खत्म करते हैं और केवल ब्रेस-संलग्न प्रारंभकर्ता है, तो संकलक यह नहीं जानता कि यह std::initializer_list<std::pair<std::string, int>>
पर देख रहा था क्योंकि यह नहीं पता था कि ब्रेसिड जोड़े फिर से प्रस्तुत std::pair
एस। इसलिए, ऐसा लगता है कि संकलक किसी भी तरह से ब्रेस-संलग्न प्रारंभकर्ता को एक प्रकार निर्दिष्ट करने के कार्य को परिभाषित कर रहा है जब तक कि std::map
कन्स्ट्रक्टर से पर्याप्त प्रकार की जानकारी न हो, यह पता लगाने के लिए कि नेस्टेड ब्रेसिज़ जोड़े के लिए हैं। मुझे ऐसा कुछ याद नहीं है जैसे सी ++ 03 में हो रहा है; मेरे सबसे अच्छे ज्ञान के लिए, अभिव्यक्ति का प्रकार कभी भी इसके संदर्भ पर निर्भर नहीं था।
कौन से भाषा नियम इस कोड को सही तरीके से संकलित करने के लिए अनुमति देते हैं और संकलक के लिए यह निर्धारित करने के लिए कि प्रारंभकर्ता सूची के लिए किस प्रकार का उपयोग करना है? मैं सी ++ 11 spec के विशिष्ट संदर्भों के साथ उत्तर की उम्मीद कर रहा हूं, क्योंकि यह वास्तव में दिलचस्प है कि यह काम करता है!
धन्यवाद!
सी ++ 03 में ब्रेस-संलग्न सूचियां प्रारंभिक संदर्भ के लिए पहले से ही बहुत विशिष्ट थीं। सी ++ 03 नेस्टेड समेकित (शायद 'std :: pair myArray []') से ब्रेसिज़ का उपयोग करके प्रारंभ में कोई महत्वपूर्ण अंतर नहीं है, सिवाय इसके कि प्रकार का नाम सीधे नहीं है, यह अनुमानित है उपलब्ध कन्स्ट्रक्टर। –
बीटीडब्ल्यू, निहित रूपांतरण ऑपरेटर (सदस्य 'ऑपरेटर टी() ') दूसरी जगह है जहां संदर्भ अभिव्यक्ति के प्रकार को निर्धारित करता है (और ओवरलोड रिज़ॉल्यूशन के लिए उपयोग किया जाता है)। –
'ब्रेस्ड-इनिट-लिस्ट 'अभिव्यक्ति नहीं है और इसमें कोई प्रकार नहीं है। कोई कटौती नहीं है, प्रारंभकर्ता-सूची कन्स्ट्रक्टर के बीच केवल अधिभार संकल्प (जिसमें से केवल एक है) – Cubbi