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: İşleviniz oluşturmadıysa noexcept olarak bildirin.

Açıklamalar

Bu kural, olarak noexceptiş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 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, , __declspec(nothrow)veya throw() kullanılarak noexceptaçı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