Bagikan melalui


Peringatan C26440

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: constexpr atau fungsi yang ditandai dengan spesifikasi pengecualian apa pun yang memerlukan perilaku non-melempar (termasuk beberapa spesifikasi non-standar).
  • Penentu non-standar dan ketinggalan jaman seperti throw() atau __declspec(nothrow) tidak setara dengan noexcept.
  • Penentu noexcept(false) eksplisit dan noexcept(true) dihormati dengan tepat.
  • Fungsi yang ditandai sebagai constexpr tidak 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*/}
};