Aracılığıyla paylaş


Uyarı C26439

Bu tür bir işlev oluşturmayabilir. 'noexcept' olarak bildirin.

C++ Temel Yönergeleri F.6: İşlevinizin oluşturmaması gerekiyorsa bunu bildirin noexcept

Bazı işlemler hiçbir zaman özel durum oluşturmamalıdır. Uygulamaları güvenilir olmalı ve olası hata koşullarını düzgün bir şekilde işlemelidir. Hata göstermek için özel durumlar kullanmamalıdır. Bu kural, bu tür işlemlerin açıkça olarak olarak noexceptişaretlenmediği durumlara bayrak ekler. Bu, özel durumlar oluşturabileceği ve tüketicilerin güvenilirliği hakkında varsayımlarda bulunamadıkları anlamına gelir.

Bu işlevlerin güvenilir olması önemlidir çünkü genellikle özel durum güvenliği garantili işlevleri uygulamak için yapı taşları olarak kullanılırlar. Oluşturan bir taşıma oluşturucu, Standart Şablon Kitaplığı (STL) kapsayıcılarını kopyalama işlemlerine geri dönmeye zorlayarak çalışma zamanı performansını düşürür.

Kod analizi adı: SPECIAL_NOEXCEPT

Açıklamalar

  • Özel işlem türleri:

    • Yıkıcı;
    • oluşturucuları taşıma ve atama işleçlerini taşıma;
    • taşıma semantiğine sahip standart işlevler: std::move ve std::swap.
  • gibi throw() standart olmayan ve güncel olmayan tanımlayıcılar ile declspec(nothrow) eşdeğer noexceptdeğildir.

  • Açık tanımlayıcılar noexcept(false) ve noexcept(true) uygun şekilde dikkate alınıyor.

Örnek

Araç, eksik noexceptolduğu için yok edici dışındaki tüm işlevlerde uyarır.

struct S
{
    ~S() {}

    S(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)
    S& operator=(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)

    S(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
    S& operator=(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
};

noexcept Aynı yapıyı süsledikten sonra tüm uyarılar kaldırılır.

struct S
{
    ~S() {}

    S(S&& s) noexcept {/*impl*/}
    S& operator=(S&& s) noexcept {/*impl*/}

    S(const S& s) noexcept {/*impl*/}
    S& operator=(const S& s) noexcept {/*impl*/}
};

Ayrıca bkz.

C26455
C++ Temel Yönergeleri F.6