Penentu pengecualian tidak digunakan lagi karena penentu pengecualian umumnya merupakan ide yang buruk . noexcept
ditambahkan 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.
noexcept
ditambahkan daripada hanya menghapus semua penentu lemparan selain throw()
karena noexcept
lebih kuat. noexcept
dapat memiliki parameter yang waktu kompilasi diselesaikan menjadi boolean. Jika boolean benar, maka noexcept
tongkatnya. Jika boolean salah, maka noexcept
tidak menempel dan fungsinya mungkin muncul.
Jadi, Anda bisa melakukan sesuatu seperti ini:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
Apakah CreateOtherClass
membuang pengecualian? Mungkin, jika T
konstruktor 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()
.
noexcept
dapat menimbulkan pemeriksaan runtime. Perbedaan utama di antara mereka adalah bahwa memutusnoexcept
sebabstd::terminate
sementara melanggarthrow
sebabstd::unexpected
. Juga perilaku pelepasan tumpukan yang sedikit berbeda dalam kasus ini.