โปรดทราบว่าสิ่งนี้มีคุณสมบัติเหมาะสมสำหรับคุณหรือไม่ แต่ในภาษาที่ใช้งานได้เช่น Standard ML ทุกอย่างจะไม่เปลี่ยนรูปโดยค่าเริ่มต้น การกลายพันธุ์ได้รับการสนับสนุนผ่านrefประเภทการรับรู้ทั่วไป ดังนั้นintตัวแปรจึงไม่เปลี่ยนรูปและref intตัวแปรจึงเป็นคอนเทนเนอร์ที่ไม่แน่นอนสำหรับints โดยพื้นฐานแล้วตัวแปรคือตัวแปรจริงในความหมายทางคณิตศาสตร์ (ค่าที่ไม่รู้จัก แต่คงที่) และrefs คือ "ตัวแปร" ในแง่การเขียนโปรแกรมที่จำเป็น - เซลล์หน่วยความจำที่สามารถเขียนและอ่านได้ (ฉันชอบเรียกพวกเขาว่ามอบหมายได้)
ฉันคิดว่าปัญหาที่เกิดขึ้นกับconstสองเท่า อันดับแรก C ++ ขาดการรวบรวมขยะซึ่งจำเป็นต้องมีโครงสร้างข้อมูลถาวรที่ไม่สำคัญ const ต้องลึกซึ้งเพื่อให้ความรู้สึกใด ๆ แต่การมีค่าที่ไม่เปลี่ยนรูปแบบใน C ++ นั้นไม่สามารถทำได้
ประการที่สองใน C ++ คุณต้องเลือกที่จะไม่เข้าconstร่วม แต่เมื่อคุณลืมconstบางสิ่งบางอย่างและแก้ไขในภายหลังคุณจะสิ้นสุดในสถานการณ์ "พิษพิษ" ที่ระบุไว้ในคำตอบของ @ RobY ซึ่งการconstเปลี่ยนแปลงจะเรียงซ้อนกันตลอดรหัส หากconstเป็นค่าเริ่มต้นคุณจะไม่พบว่าตัวเองใช้constย้อนหลัง นอกจากนี้การเพิ่มconstทุกที่เพิ่มเสียงรบกวนในรหัส
ฉันสงสัยว่าภาษากระแสหลักที่ตามมา (เช่น Java) ถูกหล่อหลอมอย่างหนักด้วยความสำเร็จของ C และ C ++ และวิธีคิด ตรงประเด็นแม้จะมีการรวบรวมขยะ API การรวบรวมภาษาส่วนใหญ่จะมีโครงสร้างข้อมูลที่ไม่แน่นอน ความจริงที่ว่าทุกสิ่งทุกอย่างไม่แน่นอนและไม่สามารถเปลี่ยนแปลงได้นั้นถูกมองว่าเป็นเรื่องมุมที่พูดถึงปริมาณความคิดที่จำเป็นหลังภาษายอดนิยม
แก้ไข : หลังจากสะท้อนความคิดเห็นของ greenoldmanฉันตระหนักว่า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วิธีการของฉันฉันคิดว่าไม่ใช่ ไม่ดีเนื่องจากคุณต้องขอช่องโหว่อย่างชัดเจน แต่คุณยังต้องพึ่งพาระบบการให้เกียรติอย่างสมบูรณ์)
ประการที่สองสมมติว่าคุณมีฟังก์ชั่นระดับสูง - นั่นคือคุณสามารถส่งผ่านฟังก์ชั่นเป็นอาร์กิวเมนต์ไปยังฟังก์ชั่นอื่น ๆ constness เป็นส่วนหนึ่งของลายเซ็นของฟังก์ชันดังนั้นคุณจะไม่สามารถส่งผ่านconstฟังก์ชันที่ไม่เป็นอาร์กิวเมนต์ไปยังฟังก์ชันที่คาดหวังconstฟังก์ชันได้ การบังคับใช้constที่นี่แบบสุ่มสี่สุ่มห้าจะนำไปสู่การสูญเสียความเห็นแก่ตัว
ในที่สุดการจัดการconstวัตถุไม่ได้รับประกันว่ามันจะไม่ทำให้เกิดการเปลี่ยนแปลงสถานะภายนอก (คงที่หรือทั่วโลก) ที่อยู่ด้านหลังของคุณดังนั้นconstการรับประกันจึงไม่แข็งแรงเท่าที่ปรากฏในตอนแรก
มันไม่ชัดเจนสำหรับฉันว่าการเข้ารหัสว่ามีหรือไม่มีผลข้างเคียงในระบบประเภทนั้นเป็นสิ่งที่ดีในระดับสากล