โดยทั่วไปหมายถึงการทำให้ฟังก์ชันไม่สามารถใช้งานได้เช่นหากคุณต้องการห้ามการใช้การจัดสรรแบบไดนามิกในโปรแกรมคุณอาจ "วางยาพิษ" ให้malloc
ฟังก์ชันนั้นไม่สามารถใช้งานได้
ในวิดีโอเขาใช้มันในลักษณะที่เฉพาะเจาะจงมากขึ้นซึ่งชัดเจนหากคุณอ่านสไลด์ที่แสดงขึ้นเมื่อเขาพูดถึงการทำให้ฟังก์ชันเป็นพิษซึ่งระบุว่า "วิธีบังคับใช้เวลาคอมไพล์เท่านั้น"
ดังนั้นเขาจึงพูดถึงฟังก์ชัน "วางยาพิษ" ที่ทำให้ไม่สามารถเรียกใช้ได้ในขณะรันไทม์ดังนั้นจึงสามารถเรียกใช้ได้เฉพาะในนิพจน์คงที่เท่านั้น เทคนิคคือการมีสาขาในฟังก์ชันซึ่งจะไม่ถูกนำมาใช้เมื่อถูกเรียกในบริบทเวลาคอมไพล์และทำให้สาขานั้นมีสิ่งที่จะทำให้เกิดข้อผิดพลาด
throw
แสดงออกที่ได้รับอนุญาตในการทำงาน constexpr ตราบใดที่มันไม่เคยถึงในระหว่างการสวดรวบรวมเวลาของการทำงาน (เพราะคุณไม่สามารถโยนข้อยกเว้นที่รวบรวมเวลาก็ดำเนินการแบบไดนามิกโดยเนื้อแท้เช่นการจัดสรรหน่วยความจำ) ดังนั้นนิพจน์ Throw ที่อ้างถึงสัญลักษณ์ที่ไม่ได้กำหนดจะไม่ถูกใช้ในระหว่างการเรียกใช้เวลาคอมไพล์ (เนื่องจากจะไม่สามารถคอมไพล์ได้) และไม่สามารถใช้ในรันไทม์ได้เนื่องจากสัญลักษณ์ที่ไม่ได้กำหนดทำให้เกิดข้อผิดพลาดตัวเชื่อมโยง
เนื่องจากสัญลักษณ์ที่ไม่ได้กำหนดไม่ใช่ "odr-used" ในการเรียกใช้ฟังก์ชันเวลาคอมไพล์ในทางปฏิบัติคอมไพลเลอร์จะไม่สร้างการอ้างอิงถึงสัญลักษณ์ดังนั้นจึงไม่เป็นไรที่ไม่ได้กำหนด
มีประโยชน์หรือไม่ เขากำลังสาธิตวิธีการทำไม่จำเป็นต้องบอกว่าเป็นความคิดที่ดีหรือมีประโยชน์อย่างกว้างขวาง หากคุณมีความจำเป็นต้องทำด้วยเหตุผลบางอย่างเทคนิคของเขาอาจช่วยแก้ปัญหาของคุณได้ หากคุณไม่มีความต้องการคุณก็ไม่จำเป็นต้องกังวลไป
เหตุผลหนึ่งที่อาจเป็นประโยชน์คือเมื่อการดำเนินการบางอย่างในเวอร์ชันคอมไพล์ไทม์ไม่มีประสิทธิภาพเท่าที่ควร มีข้อ จำกัด เกี่ยวกับประเภทของนิพจน์ที่อนุญาตในฟังก์ชัน constexpr (โดยเฉพาะใน C ++ 11 ข้อ จำกัด บางอย่างถูกลบออกใน C ++ 14) ดังนั้นคุณอาจมีฟังก์ชันสองเวอร์ชันสำหรับการคำนวณซึ่งเป็นฟังก์ชันที่เหมาะสมที่สุด แต่ใช้นิพจน์ที่ไม่ได้รับอนุญาตในฟังก์ชัน constexpr และฟังก์ชันที่เป็นฟังก์ชัน constexpr ที่ถูกต้อง แต่จะทำงานได้ไม่ดีหากเรียกขณะรัน เวลา. คุณสามารถวางยาพิษย่อยที่ดีที่สุดเพื่อให้แน่ใจว่าจะไม่ถูกใช้สำหรับการโทรแบบรันไทม์เพื่อให้แน่ใจว่าเวอร์ชันที่มีประสิทธิภาพมากขึ้น (ไม่ใช่ constexpr) ถูกใช้สำหรับการเรียกรันไทม์
NB ประสิทธิภาพของฟังก์ชัน constexpr ที่ใช้ในเวลาคอมไพล์นั้นไม่สำคัญมากนักเนื่องจากไม่มีค่าใช้จ่ายในการรันไทม์อยู่แล้ว อาจทำให้การคอมไพล์ของคุณช้าลงโดยการทำให้คอมไพเลอร์ทำงานพิเศษ แต่จะไม่มีต้นทุนประสิทธิภาพรันไทม์ใด ๆ