Penentu pengecualian tidak digunakan lagi karena penentu pengecualian umumnya merupakan ide yang buruk . noexceptditambahkan karena ini adalah satu-satunya penggunaan penentu pengecualian yang cukup berguna: mengetahui kapan suatu fungsi tidak akan mengeluarkan pengecualian. Jadi itu menjadi pilihan biner: fungsi yang akan melempar dan fungsi yang tidak akan melempar.
noexceptditambahkan daripada hanya menghapus semua penentu lemparan selain throw()karena noexceptlebih kuat. noexceptdapat memiliki parameter yang waktu kompilasi diselesaikan menjadi boolean. Jika boolean benar, maka noexcepttongkatnya. Jika boolean salah, maka noexcepttidak menempel dan fungsinya mungkin muncul.
Jadi, Anda bisa melakukan sesuatu seperti ini:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
Apakah CreateOtherClassmembuang pengecualian? Mungkin, jika Tkonstruktor default bisa. Bagaimana kita membedakannya? Seperti ini:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
Dengan demikian, CreateOtherClass()akan membuang iff dari tipe yang diberikan konstruktor default melempar. Ini memperbaiki salah satu masalah utama dengan penentu pengecualian: ketidakmampuannya untuk menyebarkan tumpukan panggilan.
Anda tidak dapat melakukan ini dengan throw().
noexceptdapat menimbulkan pemeriksaan runtime. Perbedaan utama di antara mereka adalah bahwa memutusnoexceptsebabstd::terminatesementara melanggarthrowsebabstd::unexpected. Juga perilaku pelepasan tumpukan yang sedikit berbeda dalam kasus ini.