Uyarı C26447
İşlev bildirilir
noexcept
, ancak özel durumlar oluşturabilecek işlev function_name çağırır (f.6).
C++ Temel Yönergeleri:
F.6: İşleviniz oluşturmadıysa noexcept olarak bildirin.
Açıklamalar
Bu kural, olarak noexcept
işaretlemek için iyi adaylar olan işlevleri bulmaya çalışan C26440 DECLARE_NOEXCEPT adlı başka bir kuralı düzeltmektedir. Bu durumda, bir işlevi olarak noexcept
işaretledikten sonra, özel durumlar oluşturabilecek diğer kodları çağırmayarak sözleşmesini tutması gerekir.
- Microsoft C++ derleyicisi, işlev gövdesindeki deyimler gibi
throw
basit ihlalleri zaten işler (bkz . C4297). - Kural yalnızca işlev çağrılarına odaklanır. Olmayan ve özel durumlar oluşturabilecek hedefleri
constexpr
işaretler. Başka bir deyişle, ,__declspec(nothrow)
veya throw() kullanılaraknoexcept
açıkça atılmayan olarak işaretlenmez. - Derleyici tarafından oluşturulan hedef işlevler, özel durum belirtimleri her zaman derleyici tarafından sağlanmadığından gürültüyü azaltmak için atlanır.
- Denetleyici ayrıca, uygulamanızı
noexcept
beklediğimiz özel hedef işlev türlerini de atlar; bu kural C26439 SPECIAL_NOEXCEPT tarafından uygulanır.
Örnek
#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;
}
İşlev imzasından kaldırarak noexcept
bu uyarıları düzeltebilirsiniz.
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin