वास्तव में, "hello"
प्रकार char const[6]
की है।
लेकिन प्रश्न का सारांश अभी भी सही है - क्यों सी ++ हमें एक गैर-const
प्रकार पर केवल पढ़ने के लिए स्मृति स्थान असाइन करने की अनुमति देता है?
इसका एकमात्र कारण पुराने सी कोड के पीछे की संगतता है, जिसे const
नहीं पता था। यदि सी ++ यहां सख्त था तो यह बहुत सारे मौजूदा कोड को तोड़ देता।
यह कहा गया है कि, अधिकांश कंप्यूटर्स को पर को ऐसे कोड के बारे में चेतावनी दी जा सकती है, जो डिफ़ॉल्ट रूप से बहिष्कृत या यहां तक कि ऐसा भी करती है। इसके अलावा, सी ++ 11 इसे पूरी तरह से अस्वीकार करता है लेकिन संकलक अभी तक इसे लागू नहीं कर सकते हैं।
Standerdese प्रशंसक के लिए:
[रेफरी 1]सी ++ 03 मानक: §4.2/2
एक स्ट्रिंग शाब्दिक (2.13.4) नहीं एक विस्तृत है कि स्ट्रिंग शाब्दिक को "पॉइंटर टू चार" प्रकार के रैवल्यू में परिवर्तित किया जा सकता है; एक विस्तृत स्ट्रिंग अक्षर को "पॉइंटर से wchar_t" प्रकार के रैवल्यू में परिवर्तित किया जा सकता है। किसी भी मामले में, परिणाम सरणी के पहले तत्व के लिए एक सूचक है। यह रूपांतरण तभी माना जाता है जब कोई स्पष्ट उपयुक्त सूचक लक्ष्य प्रकार होता है, और जब एक सामान्यता से एक रावल्यू में परिवर्तित करने की सामान्य आवश्यकता होती है। [नोट: यह रूपांतरण को हटा दिया गया है। अनुलग्नक डी देखें।] ओवरलोड रिज़ॉल्यूशन (13.3.3.1.1) में रैंकिंग के उद्देश्य के लिए, इस रूपांतरण को एक योग्यता रूपांतरण (4.4) के बाद एक सरणी-से-पॉइंटर रूपांतरण माना जाता है। [उदाहरण: "एबीसी" को "पॉइंटर टू कॉन्स्ट चार" में एक सरणी-से-पॉइंटर रूपांतरण के रूप में परिवर्तित किया जाता है, और फिर योग्यता रूपांतरण के रूप में "पॉइंटर टू char" में परिवर्तित किया जाता है। ]
सी ++ 11 उपर्युक्त उद्धरण को हटा देता है जिसका अर्थ है कि यह सी ++ 11 में अवैध कोड है।
[रेफरी 2]C99 मानक 6.4.5/5 "स्ट्रिंग literals - शब्दार्थ":
अनुवाद चरण 7 में, एक बाइट या शून्य मूल्य का कोड प्रत्येक multibyte चरित्र में जोड़ा जाता है एक स्ट्रिंग अक्षर या शाब्दिक से परिणाम अनुक्रम। मल्टीबाइट वर्ण अनुक्रम का उपयोग तब स्थिर भंडारण अवधि और लंबाई की सरणी को प्रारंभ करने के लिए किया जाता है ताकि अनुक्रम को शामिल किया जा सके।चरित्र स्ट्रिंग अक्षर के लिए, सरणी तत्वों में टाइप चार होता है, और मल्टीबाइट वर्ण अनुक्रम के व्यक्तिगत बाइट्स के साथ प्रारंभ किया जाता है; विस्तृत स्ट्रिंग अक्षर के लिए, सरणी तत्वों में wchar_t टाइप होता है, और विस्तृत वर्णों के अनुक्रम के साथ प्रारंभ किया जाता है ...
यह निर्दिष्ट नहीं है कि ये सरणी अलग हैं या नहीं, उनके तत्वों के उचित मान हैं। यदि प्रोग्राम ऐसी सरणी को संशोधित करने का प्रयास करता है, तो व्यवहार अपरिभाषित है।
यह केवल सी संगतता के लिए अनुमति है। आम तौर पर सी ++ में इसे बहिष्कृत माना जाता है और अच्छे कंपेलर चेतावनी देते हैं। – iammilind