ตัวระบุข้อยกเว้นถูกเลิกใช้งานเนื่องจากโดยทั่วไปตัวระบุข้อยกเว้นเป็นความคิดที่แย่มาก noexcept
ถูกเพิ่มเข้ามาเนื่องจากเป็นการใช้ตัวระบุข้อยกเว้นที่มีประโยชน์อย่างสมเหตุสมผล: เมื่อทราบว่าฟังก์ชันจะไม่ส่งข้อยกเว้น ดังนั้นจึงกลายเป็นทางเลือกไบนารี: ฟังก์ชันที่จะโยนและฟังก์ชันที่จะไม่โยน
noexcept
ถูกเพิ่มเข้ามาแทนที่จะลบตัวระบุการโยนทั้งหมดนอกเหนือจากthrow()
เพราะnoexcept
มีประสิทธิภาพมากกว่า noexcept
สามารถมีพารามิเตอร์ที่คอมไพล์ - ไทม์แก้ไขเป็นบูลีน ถ้าบูลีนเป็นจริงnoexcept
แท่ง ถ้าบูลีนเป็นเท็จแสดงnoexcept
ว่าไม่ติดและฟังก์ชันอาจโยน
ดังนั้นคุณสามารถทำสิ่งนี้:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
ไม่CreateOtherClass
ยกเว้นโยน? อาจเป็นไปได้หากตัวT
สร้างเริ่มต้นสามารถทำได้ เราจะบอกยังไง? แบบนี้:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
ดังนั้นCreateOtherClass()
จะโยน iff ที่ตัวสร้างเริ่มต้นของประเภทที่กำหนดจะพ่น วิธีนี้แก้ไขปัญหาหลักอย่างหนึ่งของตัวระบุข้อยกเว้น: ไม่สามารถเผยแพร่ call stack ได้
คุณไม่สามารถทำได้ด้วยthrow()
.
noexcept
อาจเกิดขึ้นจากการตรวจสอบรันไทม์ แตกต่างที่สำคัญระหว่างพวกเขาที่ถูกทำลายnoexcept
สาเหตุstd::terminate
ขณะที่หมดสาเหตุthrow
std::unexpected
นอกจากนี้พฤติกรรมการคลี่คลายกองซ้อนที่แตกต่างกันเล็กน้อยในกรณีเหล่านี้