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 dapat dinyatakan 'noexcept'.
C++ Panduan Inti F.6: Jika fungsi Anda tidak boleh dilemparkan, nyatakan noexcept
Jika kode tidak seharusnya menyebabkan pengecualian apa pun, kode tersebut harus ditandai dengan menggunakan penentu noexcept . Anotasi ini membantu menyederhanakan penanganan kesalahan di sisi kode klien, dan memungkinkan pengompilasi untuk melakukan lebih banyak pengoptimalan.
Keterangan
- Fungsi dianggap tidak melempar jika:
- tidak memiliki pernyataan eksplisit
throw; - fungsi memanggil dalam isinya, jika ada, hanya memanggil fungsi yang tidak mungkin melemparkan:
constexpratau fungsi yang ditandai dengan spesifikasi pengecualian apa pun yang memerlukan perilaku non-melempar (termasuk beberapa spesifikasi non-standar).
- tidak memiliki pernyataan eksplisit
- Penentu non-standar dan ketinggalan jaman seperti
throw()atau__declspec(nothrow)tidak setara dengannoexcept. - Penentu
noexcept(false)eksplisit dannoexcept(true)dihormati dengan tepat. - Fungsi yang ditandai sebagai
constexprtidak seharusnya menyebabkan pengecualian dan tidak dianalisis. - Aturan ini juga berlaku untuk ekspresi lambda.
- Logika tidak menganggap panggilan rekursif berpotensi tidak melempar. Logika ini dapat berubah di masa mendatang.
Contoh
Semua fungsi kecuali destruktor akan memperingatkan karena tidak ada noexcept.
struct S
{
S() {} // C26455, Default constructor may not throw. Declare it 'noexcept'
~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 yang mendekorasi struktur yang sama, semua peringatan dihapus.
struct S
{
S() noexcept {}
~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*/}
};