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 ini dinyatakan
noexcepttetapi 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
throwpernyataan dalam isi fungsi (lihat C4297). - Aturan hanya berfokus pada panggilan fungsi. Ini menandai target yang tidak
constexprdan yang berpotensi melemparkan pengecualian. Dengan kata lain, mereka tidak ditandai secara eksplisit sebagai non-melempar dengan menggunakannoexcept, ,__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.