ध्यान दें कि यदि यह आपके लिए योग्य है, लेकिन मानक एमएल जैसी कार्यात्मक भाषाओं में सब कुछ डिफ़ॉल्ट रूप से अपरिवर्तनीय है। उत्परिवर्तन एक सामान्य refएरेस प्रकार के माध्यम से समर्थित है । तो एक intचर अपरिवर्तनीय है, और एक ref intचर ints के लिए एक परिवर्तनशील कंटेनर है । असल में, चर हैं असली गणितीय अर्थ (एक अज्ञात लेकिन निश्चित मान) में चर और refएक स्मृति सेल कि करने के लिए लिखा जा सकता है और से पढ़ा - s "चर" जरूरी प्रोग्रामिंग अर्थ में कर रहे हैं। (मैं उन्हें असाइन करने के लिए कॉल करना पसंद करता हूं ।)
मुझे लगता है कि समस्या constदो गुना है। सबसे पहले, C ++ में कचरा संग्रह का अभाव है, जो गैर-तुच्छ लगातार डेटा संरचनाओं के लिए आवश्यक है । किसी भी अर्थ में गहरा const होना चाहिए, फिर भी C ++ में पूरी तरह से अपरिवर्तनीय मान होना अव्यावहारिक है।
दूसरा, C ++ में आपको constइससे बाहर निकलने के बजाय विकल्प चुनने की जरूरत है। लेकिन जब आप constकिसी चीज़ को भूल जाते हैं और बाद में उसे ठीक कर लेते हैं, तो आप @ RobY के जवाब में बताई गई "कॉन्स्ट पॉइज़निंग" स्थिति को समाप्त कर देंगे जहाँ constपरिवर्तन पूरे कोड में कैस्केड होगा। यदि constडिफ़ॉल्ट था, तो आप खुद को constपीछे हटने वाला नहीं पाएंगे । इसके अतिरिक्त, constहर जगह जोड़ने के लिए कोड के लिए बहुत शोर जोड़ता है।
मुझे संदेह है कि मुख्यधारा की भाषाओं ने (उदाहरण के लिए जावा) को C और C ++ की सफलता और सोचने के तरीके से बहुत अधिक आकार दिया था। बिंदु में मामला, यहां तक कि कचरा संग्रह के साथ अधिकांश भाषाओं के संग्रह एपीआई परस्पर डेटा संरचनाओं को मानते हैं। तथ्य यह है कि सब कुछ परिवर्तनशील और अपरिवर्तनीयता के रूप में देखा जाता है क्योंकि कोने का मामला लोकप्रिय भाषाओं के पीछे अनिवार्य मानसिकता के बारे में बोलता है।
EDIT : ग्रीनल्डमैन की टिप्पणी पर विचार करने के बाद मुझे महसूस हुआ कि constसीधे डेटा की अपरिहार्यता के बारे में नहीं है; constविधि के प्रकार में सांकेतिक शब्दों में बदलना है कि क्या यह उदाहरण पर दुष्प्रभाव है।
संदर्भित रूप से पारदर्शी व्यवहार प्राप्त करने के लिए म्यूटेशन का उपयोग करना संभव है । मान लीजिए कि आपके पास एक फ़ंक्शन है जिसे जब क्रमिक रूप से अलग-अलग मान लौटाते हैं - उदाहरण के लिए, एक फ़ंक्शन जो किसी एकल वर्ण को पढ़ता है stdin। हम इस फ़ंक्शन के परिणामों को संचयित कर सकते हैं / मानों के संदर्भ में पारदर्शी प्रवाह उत्पन्न करने के लिए इस फ़ंक्शन के परिणामों को याद कर सकते हैं। स्ट्रीम एक लिंक की गई सूची होगी, जिसके नोड्स फ़ंक्शन को पहली बार कॉल करेंगे जब आप उनके मूल्य को पुनः प्राप्त करने का प्रयास करेंगे, लेकिन फिर परिणाम को कैश करें। तो अगर stdinconstains Hello, world!, पहली बार जब आप पहली नोड के मूल्य प्राप्त करने का प्रयास है, यह एक पढ़ेंगे charऔर बदले H। बाद में यह Hआगे पढ़ने के लिए कॉल के बिना लौटना जारी रखेगा char। इसी तरह, दूसरा नोड एक charसे पढ़ेगाstdinपहली बार जब आप इसके मूल्य को पुनः प्राप्त करने का प्रयास करते हैं, तो इस बार लौटते हैं eऔर उस परिणाम को कैशिंग करते हैं।
यहाँ दिलचस्प बात यह है कि आपने एक ऐसी प्रक्रिया को बदल दिया है जो स्वाभाविक रूप से एक वस्तु में स्टेटफुल है जो प्रतीत होता है कि स्टेटलेस है। हालांकि, इसे प्राप्त करने के लिए ऑब्जेक्ट की आंतरिक स्थिति (परिणामों को कैशिंग करके) को म्यूट करना आवश्यक था - म्यूटेशन एक सौम्य प्रभाव था । CharStream constभले ही धारा अपरिवर्तनीय मूल्य की तरह व्यवहार करती है , यह हमारे लिए असंभव है । अब कल्पना करें कि विधियों के Streamसाथ एक इंटरफ़ेस है const, और आपके सभी कार्यों की उम्मीद है const Streams। आपका CharStreamइंटरफ़ेस लागू नहीं कर सकता!
( संस्करण 2: जाहिर है कि C ++ कीवर्ड कहा जाता है mutableजो हमें धोखा देने और बनाने की अनुमति देगाCharStream const । हालांकि, यह खामियों की constगारंटी देता है - अब आप वास्तव में सुनिश्चित नहीं हो सकते कि कुछ इसके constतरीकों के माध्यम से उत्परिवर्तित नहीं होगा । मुझे लगता है कि यह नहीं है। बुरा आप स्पष्ट रूप से बचाव का अनुरोध करना चाहिए, लेकिन आप अभी भी पूरी तरह से सम्मान प्रणाली पर निर्भर हैं।
दूसरे, मान लीजिए कि आपके पास उच्च-क्रम के कार्य हैं - अर्थात, आप कार्यों को अन्य कार्यों के तर्क के रूप में पारित कर सकते हैं। constनेस एक फंक्शन के सिग्नेचर का हिस्सा है, इसलिए आप नॉन- constफंक्शन्स को उन फंक्शन के लिए पास नहीं कर पाएंगे जो constफंक्शन्स की अपेक्षा रखते हैं। अंधाधुंध constयहां लागू करने से व्यापकता का नुकसान होगा।
अंत में, किसी constऑब्जेक्ट में हेरफेर करने की गारंटी नहीं है कि यह आपकी पीठ के पीछे कुछ बाहरी (स्थिर या वैश्विक) स्थिति को उत्परिवर्तित नहीं कर रहा है, इसलिए constगारंटी के रूप में वे शुरू में मजबूत नहीं होते हैं।
यह मेरे लिए स्पष्ट नहीं है कि प्रकार की प्रणाली में साइड इफेक्ट्स की उपस्थिति या अनुपस्थिति को एन्कोडिंग सार्वभौमिक रूप से एक अच्छी बात है।