Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Fungsi semacam ini mungkin tidak dilemparkan. Nyatakan 'noexcept'.
F.6: Jika fungsi Anda tidak boleh melemparkan, nyatakan noexcept
Beberapa operasi tidak boleh melemparkan pengecualian. Implementasinya harus dapat diandalkan dan harus menangani kemungkinan kondisi kesalahan dengan anggun. Mereka tidak boleh menggunakan pengecualian untuk menunjukkan kegagalan. Aturan ini menandai kasus di mana operasi tersebut tidak secara eksplisit ditandai sebagai noexcept, yang berarti bahwa mereka dapat melemparkan pengecualian dan konsumen tidak dapat membuat asumsi tentang keandalannya.
Penting bagi fungsi-fungsi ini untuk dapat diandalkan karena sering digunakan sebagai blok penyusun untuk mengimplementasikan fungsi dengan jaminan keamanan pengecualian. Konstruktor pemindahan yang melemparkan akan memaksa kontainer Pustaka Templat Standar (STL) untuk kembali ke operasi salin, mengurangi performa runtime.
Nama analisis kode: SPECIAL_NOEXCEPT
Keterangan
Jenis operasi khusus:
- destruktor;
- memindahkan konstruktor dan memindahkan operator penugasan;
- fungsi standar dengan semantik pemindahan:
std::movedanstd::swap.
Penentu yang tidak standar dan ketinggalan jaman seperti
throw()ataudeclspec(nothrow)tidak setara dengannoexcept.Penentu
noexcept(false)eksplisit dannoexcept(true)dihormati dengan tepat.
Contoh
Alat ini memperingatkan semua fungsi kecuali destruktor karena hilang noexcept.
struct S
{
~S() {}
S(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)
S& operator=(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)
S(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
S& operator=(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
};
Dengan noexcept menghias struktur yang sama, semua peringatan dihapus.
struct S
{
~S() {}
S(S&& s) noexcept {/*impl*/}
S& operator=(S&& s) noexcept {/*impl*/}
S(const S& s) noexcept {/*impl*/}
S& operator=(const S& s) noexcept {/*impl*/}
};
Lihat juga
C26455
F.6: Jika fungsi Anda tidak boleh melemparkan, nyatakan noexcept