बाध्य एक अभिन्न निरंतर अभिव्यक्ति होना चाहिए एक सरणी, 8.3.4 [dcl.array]/1 (सी ++ 03 और में उन्हीं शब्दों का देखना सी ++ 11):
यदि निरंतर अभिव्यक्ति (5.1 9) मौजूद है, तो यह एक अभिन्न निरंतर अभिव्यक्ति होगी और इसका मान शून्य से अधिक होगा।
सी ++ 03 एक अभिन्न निरंतर अभिव्यक्ति में एक अस्थायी शाब्दिक द्वारा आरंभ नहीं किया जा सकता जब तक कि अभिन्न प्रकार के कलाकारों, 5.19 [expr.const] का अंतिम वाक्य/1 देखें:
एक अभिन्न निरंतर अभिव्यक्ति में केवल शाब्दिक (2.13), अंकुशक, const
स्थिर अभिव्यक्ति (8.5), अभिन्न या गणना प्रकारों के गैर-प्रकार टेम्पलेट पैरामीटर, और sizeof
अभिव्यक्तियों के साथ प्रारंभिक या गणितीय प्रकारों के चर या डेटा डेटा शामिल हो सकते हैं। फ़्लोटिंग अक्षर (2.13.3) केवल तभी दिखाई दे सकते हैं जब उन्हें अभिन्न या गणना प्रकारों में डाला जाता है।
यह है कि इसका मतलब है में सी ++ 03 i
एक अभिन्न निरंतर अभिव्यक्ति नहीं है, इसलिए एक सरणी के लिए बाध्य के रूप में इस्तेमाल नहीं किया जा सकता।
जीसीसी और क्लैंग परिवर्तनीय-लंबाई सरणी को C++ 03 के विस्तार के रूप में अनुमति देता है, इसलिए यह एक गैर-स्थिर बाध्यता के साथ संकलित करता है, लेकिन आपको -pedantic
के साथ चेतावनी मिलती है। अभिन्न प्रकार में कास्ट करने के लिए निरंतर के प्रारंभकर्ता बदलने i
एक वैध अभिन्न निरंतर अभिव्यक्ति करता है:
const int i = (int) 1.0;
कि सरणी को बदलने के साथ
नहीं रह गया है चर लंबाई है और वहाँ भी -pedantic
के साथ कोई चेतावनी है।
में सी ++ 11 5.19 [expr.const]/3 का कहना है:
एक शाब्दिक निरंतर अभिव्यक्ति शाब्दिक प्रकार का एक prvalue कोर निरंतर अभिव्यक्ति है, लेकिन प्रकार सूचक नहीं। एक अभिन्न स्थिर अभिव्यक्ति अभिन्न या unscoped गणना प्रकार की एक शाब्दिक निरंतर अभिव्यक्ति है।
पूर्ववर्ती (काफी लंबा) पैराग्राफ कोर निरंतर भाव के लिए नियमों का वर्णन है, लेकिन सी ++ 11 में मूल रूप से डबल प्रारंभकर्ता i
नहीं रोकता है एक कोर निरंतर अभिव्यक्ति जा रहा है, यहां तक कि एक डाली के बिना, तो यह एक है अभिन्न निरंतर अभिव्यक्ति और इसलिए एक मान्य सरणी बाध्य है, इसलिए कोई चेतावनी नहीं है।
क्या आपका मतलब है कि मैं एक डबल हूं, न कि int? – David
@ डेव: नहीं, यह उद्देश्य पर था। पिछले प्रश्न का लिंक देखें। –
एफडब्ल्यूआईडब्ल्यू, क्लैंग ++ 3.0 वीएलए चेतावनी नहीं दिखाता है। मेरे पास परीक्षण करने के लिए g ++ नहीं है, लेकिन मुझे लगता है कि अगर आप 'const int i = 1;' असाइनमेंट को बदलते हैं तो चेतावनी दूर नहीं जाती है। क्या यह? – jweyrich