Bagikan melalui


Peringatan C26439

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::move dan std::swap.
  • Penentu yang tidak standar dan ketinggalan jaman seperti throw() atau declspec(nothrow) tidak setara dengan noexcept.

  • Penentu noexcept(false) eksplisit dan noexcept(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