Bagikan melalui


Peringatan C26447

Fungsi ini dinyatakan noexcept tetapi memanggil fungsi function_name yang dapat melempar pengecualian (f.6).

Pedoman Inti C++:
F.6: Jika fungsi Anda harus tidak melemparkan pengecualian, nyatakan sebagai noexcept.

Keterangan

Aturan ini mengubah aturan lain, C26440 DECLARE_NOEXCEPT, yang mencoba menemukan fungsi yang merupakan kandidat yang baik untuk ditandai sebagai noexcept. Dalam hal ini, idenya adalah bahwa setelah Anda menandai beberapa fungsi sebagai noexcept, itu harus mempertahankan kontraknya dengan tidak memanggil kode lain yang dapat melemparkan pengecualian.

  • Pengkompilasi Microsoft C++ sudah menangani pelanggaran langsung seperti throw pernyataan dalam isi fungsi (lihat C4297).
  • Aturan hanya berfokus pada panggilan fungsi. Ini menandai target yang tidak constexpr dan yang berpotensi melemparkan pengecualian. Dengan kata lain, mereka tidak ditandai secara eksplisit sebagai non-melempar dengan menggunakan noexcept, , __declspec(nothrow)atau throw().
  • Fungsi target yang dihasilkan kompilator dilewati untuk mengurangi kebisingan karena spesifikasi pengecualian tidak selalu disediakan oleh pengkompilasi.
  • Pemeriksa juga melewati jenis fungsi target khusus yang kami harapkan anda terapkan sebagai noexcept; aturan ini diberlakukan oleh C26439 SPECIAL_NOEXCEPT.

Contoh

#include <vector>
#include <string>
#include <istream>

std::vector<std::string> collect(std::istream& is) noexcept
{
    std::vector<std::string> res;
    for (std::string s; is >> s;) // C26447, `operator bool()` can  throw, std::string's allocator can throw
        res.push_back(s);         // C26447, `push_back` can throw
    return res;
}

Anda dapat memperbaiki peringatan ini dengan menghapus noexcept dari tanda tangan fungsi.

Lihat juga

C26440 DECLARE_NOEXCEPT