2012-06-07 16 views
8

उदाहरणएक चल बिन्दु शाब्दिक

int main() 
{ 
    const int i = 1.0; // Notice I am assigning a double to an int here 
    char a[i]; 
} 

प्रश्न

g++ -O0 -Wall -pedantic -ansi -std=c++11 साथ उपरोक्त कोड संकलन के साथ एक स्थिरांक पूर्णांक शुरु कर रहा है कोई त्रुटि (एक अप्रयुक्त चर को छोड़ कर) देता है। हालांकि, अगर मैं -std=c++11 निकालने के लिए, मैं निम्नलिखित चेतावनी मिलती है:

चेतावनी: आईएसओ सी ++ मनाही चर लंबाई सरणी

this SO question के अनुसार, मुझे विश्वास है कि सी ++ 03 में, कोड अमान्य है । हालांकि, क्या कोई बता सकता है कि सी ++ 11 में नियम कैसे बदल गया है?

(यह सवाल a previous question का एक परिणाम मैंने जवाब था।)

+0

क्या आपका मतलब है कि मैं एक डबल हूं, न कि int? – David

+0

@ डेव: नहीं, यह उद्देश्य पर था। पिछले प्रश्न का लिंक देखें। –

+0

एफडब्ल्यूआईडब्ल्यू, क्लैंग ++ 3.0 वीएलए चेतावनी नहीं दिखाता है। मेरे पास परीक्षण करने के लिए g ++ नहीं है, लेकिन मुझे लगता है कि अगर आप 'const int i = 1;' असाइनमेंट को बदलते हैं तो चेतावनी दूर नहीं जाती है। क्या यह? – jweyrich

उत्तर

7

बाध्य एक अभिन्न निरंतर अभिव्यक्ति होना चाहिए एक सरणी, 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 नहीं रोकता है एक कोर निरंतर अभिव्यक्ति जा रहा है, यहां तक ​​कि एक डाली के बिना, तो यह एक है अभिन्न निरंतर अभिव्यक्ति और इसलिए एक मान्य सरणी बाध्य है, इसलिए कोई चेतावनी नहीं है।

+1

जीसीसी गलत पूर्णांक निरंतर प्रारंभिकरण के बारे में चेतावनी नहीं देता है। यह वीएलए कंपाइलर एक्सटेंशन के उपयोग के बारे में चेतावनी देता है (जो सी ++ 11 अब और उपयोग नहीं करता है, क्योंकि सी ++ 11 में सरणी को निरंतर द्वारा प्रारंभ किया जा सकता है)। –

+0

@ कोनराड, हाँ, बस इसे स्पष्ट करने के लिए संपादित किया गया है जिसका अर्थ है "इसे अनुमति देता है" –

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