Bagikan melalui


noexcept (C++)

C++11: Menentukan apakah fungsi mungkin melemparkan pengecualian.

Sintaks

noexcept-specifier:
noexcept
noexcept-expression
throw ( )
noexcept-expression:
noexcept ( constant-expression )

Parameter

constant-expression
Ekspresi konstan jenis bool yang mewakili apakah kumpulan jenis pengecualian potensial kosong. Versi tidak bersyarat setara noexcept(true)dengan .

Keterangan

noexcept-expression adalah semacam spesifikasi pengecualian: akhiran untuk deklarasi fungsi yang mewakili sekumpulan jenis yang mungkin cocok dengan handler pengecualian untuk pengecualian apa pun yang keluar dari fungsi. Operator noexcept(constant_expression) bersyarat unary ketika constant_expression menghasilkan , dan sinonimnya noexceptyang tidak bersyarat true, tentukan bahwa kumpulan jenis pengecualian potensial yang dapat keluar dari fungsi kosong. Artinya, fungsi tidak pernah melemparkan pengecualian dan tidak pernah memungkinkan pengecualian untuk disebarluaskan di luar cakupannya. Operator noexcept(constant_expression) ketika constant_expression menghasilkan false, atau tidak adanya spesifikasi pengecualian (selain untuk fungsi destruktor atau dealokasi), menunjukkan bahwa serangkaian pengecualian potensial yang dapat keluar dari fungsi adalah set dari semua jenis.

Tandai fungsi sebagai noexcept hanya jika semua fungsi yang dipanggilnya, baik secara langsung atau tidak langsung, juga noexcept atau const. Pengkompilasi tidak selalu memeriksa setiap jalur kode untuk pengecualian yang mungkin menggelegak hingga noexcept fungsi. Jika pengecualian keluar dari cakupan luar fungsi yang ditandai noexcept, std::terminate segera dipanggil, dan tidak ada jaminan bahwa destruktor objek dalam cakupan akan dipanggil. Gunakan noexcept alih-alih penentu throw()pengecualian dinamis . Spesifikasi pengecualian dinamis, atau throw(optional_type_list) spesifikasi, tidak digunakan lagi di C++11 dan dihapus di C++17, kecuali untuk throw(), yang merupakan alias untuk noexcept(true). Kami menyarankan Anda menerapkan noexcept ke fungsi apa pun yang tidak pernah memungkinkan pengecualian untuk menyebarkan tumpukan panggilan. Ketika fungsi dideklarasikan noexcept, fungsi memungkinkan pengkompilasi untuk menghasilkan kode yang lebih efisien dalam beberapa konteks yang berbeda. Untuk informasi selengkapnya, lihat Spesifikasi pengecualian.

Contoh

Templat fungsi yang menyalin argumennya mungkin dideklarasikan noexcept pada kondisi bahwa objek yang disalin adalah tipe data lama biasa (POD). Fungsi seperti itu dapat dinyatakan seperti ini:

#include <type_traits>

template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
{
   // ...
}

Lihat juga

Praktik terbaik C++ modern untuk pengecualian dan penanganan kesalahan
Spesifikasi pengecualian (throw, noexcept)