3
เหตุใดข้อความข้อผิดพลาดเทมเพลต C ++ จึงน่ากลัวมาก
เทมเพลต C ++ มีชื่อเสียงในด้านการสร้างข้อความแสดงข้อผิดพลาดที่ยาวและไม่สามารถอ่านได้ ฉันมีความคิดทั่วไปว่าทำไมข้อความแสดงข้อผิดพลาดแม่แบบใน C ++ จึงแย่มาก โดยพื้นฐานแล้วปัญหาคือว่าข้อผิดพลาดจะไม่ถูกเรียกจนกระทั่งคอมไพเลอร์พบไวยากรณ์ที่ไม่ได้รับการสนับสนุนจากบางประเภทในแม่แบบ ตัวอย่างเช่น: template <class T> void dosomething(T& x) { x += 5; } หากTไม่รองรับ+=ผู้ปฏิบัติงานคอมไพเลอร์จะสร้างข้อความแสดงข้อผิดพลาด และหากสิ่งนี้เกิดขึ้นลึกลงไปในห้องสมุดบางแห่งข้อความแสดงข้อผิดพลาดอาจยาวหลายพันบรรทัด แต่แม่แบบ C ++ นั้นเป็นเพียงกลไกสำหรับการพิมพ์เป็ดเวลาคอมไพล์ ข้อผิดพลาดแม่แบบ C ++ เป็นแนวคิดคล้ายกับข้อผิดพลาดประเภทรันไทม์ที่อาจเกิดขึ้นในภาษาแบบไดนามิกเช่น Python ตัวอย่างเช่นพิจารณารหัสไพ ธ อนต่อไปนี้: def dosomething(x): x.foo() ที่นี่หากxไม่มีfoo()วิธีใดตัวแปลภาษา Python จะแสดงข้อยกเว้นและแสดงการติดตามสแต็กพร้อมกับข้อความแสดงข้อผิดพลาดที่ค่อนข้างชัดเจนซึ่งระบุถึงปัญหา แม้ว่าข้อผิดพลาดจะไม่ถูกเรียกใช้จนกว่าล่ามจะอยู่ลึกเข้าไปในฟังก์ชั่นของห้องสมุด แต่ข้อความข้อผิดพลาดเกี่ยวกับรันไทม์ยังไม่ใกล้เคียงเท่าที่อาเจียนไม่สามารถอ่านได้โดยคอมไพเลอร์ C ++ ทั่วไป แล้วทำไมคอมไพเลอร์ C ++ ไม่สามารถบอกได้ชัดเจนว่าเกิดอะไรขึ้น …