ตัวระบุข้อยกเว้นถูกเลิกใช้งานเนื่องจากโดยทั่วไปตัวระบุข้อยกเว้นเป็นความคิดที่แย่มาก 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ขณะที่หมดสาเหตุthrowstd::unexpectedนอกจากนี้พฤติกรรมการคลี่คลายกองซ้อนที่แตกต่างกันเล็กน้อยในกรณีเหล่านี้