Aracılığıyla paylaş


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: Fonksiyonunuzun throw etmemesi gerekiyorsa, onu noexcept olarak bildirin.

Açıklamalar

Bu kural, adlı başka bir kuralı düzeltmektedir. Bu durumda, bir işlevi olarak noexceptiş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, , noexceptveya throw() kullanılarak __declspec(nothrow)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ı noexceptbeklediğ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.

C26440 DECLARE_NOEXCEPT