2017-06-20 16 views
14

मेरे पास the different meanings of a curly-brace enclosed list के बारे में कोई प्रश्न है।जीसीसी 6.3 स्पष्ट रूप से सी ++ 11 समर्थन के बिना इस ब्रेस्ड-इनिट-लिस्ट कोड को संकलित क्यों करता है?

मुझे पता है कि सी ++ 03 ने सी ++ 11 के initializer_list का समर्थन नहीं किया। फिर भी, यहां तक ​​कि -std=c++11 संकलक ध्वज के बिना, इस कोड के साथ 6.3 will properly initialize interpolate जीसीसी:

map<string, string> interpolate = { { "F", "a && b && c" }, { "H", "p^2 + w" }, { "K", "H > 10 || e < 5" }, { "J", "F && !K" } }; 

क्यों यह काम करेगा पर I was challenged, और मैंने महसूस किया कि मैं एक जवाब नहीं था। यह एक ब्रेस-इनिट-लिस्ट है, लेकिन एक मानक कंटेनर शुरू करने के लिए हम जिस तरह से प्राप्त करते हैं वह आम तौर पर initializer_list के माध्यम से होता है। तो गैर-सी ++ 11 कोड प्रारंभिकरण कैसे पूरा करेगा?

+2

मुझे आश्चर्य है कि यह प्रश्न 'हॉट नेटवर्क प्रश्न' सूची में बनाया गया है: | मैंने सोचा कि यह gcc द्वारा अच्छी तरह से दस्तावेज किया गया था और नए जीसीसी – P0W

+1

@ पी 0 डब्ल्यू में डिफ़ॉल्ट संकलन झंडे के बारे में इंटरनेट पर कई जगहों पर मैं थोड़ा आश्चर्यचकित हूं। उस समय मैंने यह पूछा कि मुझे लगता है कि जीसीसी 5 में डिफ़ॉल्ट व्यवहार के समान, मैं "-std = C++ 98" का उपयोग कर रहा था। मैं अनुमान लगा रहा हूं कि बहुत से लोग इस बात पर थे कि किस तरह की पूर्वकल्पना थी। चिंता न करें, मुझे यकीन है कि यह सिर्फ एक विचलन था, नियमित सी ++ डाउन-वोट अनुपात जल्द ही बहाल किया जाना चाहिए। –

उत्तर

33

default compiler command for gcc 6.x is -std=gnu++14, इसलिए संकलक सी ++ भाषा मानक के बाद के संस्करण का उपयोग करके आपके कोड को पूर्ण रूप से संकलित कर रहा है।

यदि आप C++ 03 में संकलित करना चाहते हैं तो आपको मैन्युअल रूप से -std=c++03 निर्दिष्ट करना होगा।

+18

एक और दिलचस्प सवाल यह है कि लोग एक नए कंपाइलर को अभी भी 14 वर्षीय मानक के लिए डिफ़ॉल्ट होने की उम्मीद करेंगे! वैसे भी, तथ्य यह है कि 'g ++ '6 ने ऐसा करना बंद कर दिया है, लेकिन मेरी इच्छा है कि डिफ़ॉल्ट रूप से' C++ 14' था, बिना किसी एक्सटेंशन के; अन्यथा, लोग मान सकते हैं कि डिफ़ॉल्ट रूप से 'g ++' अनुमति देता है, जिसे अच्छी तरह परिभाषित किया जाता है, जो मामला नहीं है। –

+3

यह एक धारणा के रूप में अनुचित नहीं है जैसा कि आप इसे बनाते हैं, @underscore_d। डिफ़ॉल्ट चुनने के लिए दो मूलभूत रणनीतियां हैं: (ए) उन्हें जो भी लगता है उसे सबसे अधिक वांछित बनाते हैं, या (बी) उन्हें यथासंभव असफल-सुरक्षित बनाते हैं। यदि रणनीति (बी) का उपयोग किया गया था, तो सी ++ 03 में डिफॉल्ट करने से अच्छी समझ होगी। यह मौजूदा कोड बेस को कंपाइलर के बाद के संस्करण में अपग्रेड करने में भी सुविधा प्रदान करता है, जो रणनीति (ए) गंभीरता से जटिल होगी, मान लीजिए कि यह संकलक उस संकलक के साथ संकलित सभी कोड * नया * कोड है। हालांकि, जीएनयू एक्सटेंशन को डिफॉल्ट करने पर पूरी तरह से सहमत नहीं है! –

+3

@ कोडीग्रे दाएं, अच्छे अंक। इसके अलावा, उम्मीद है कि डिफ़ॉल्ट मानक होगा ... विंटेज में एक उदाहरण है: 'g ++' 5 अभी भी _C++ 98_ पर डिफ़ॉल्ट है, फेर गुडनेस! –

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