Aracılığıyla paylaş


Uyarı C26440

İşlev 'noexcept' olarak bildirilebilir.

C++ Temel Yönergeleri F.6: İşleviniz oluşturmuyorsa bunu bildirin noexcept

Kodun özel durumlara neden olmaması gerekiyorsa, tanımlayıcı kullanılarak noexcept işaretlenmelidir. Bu ek açıklama, istemci kodu tarafında hata işlemeyi basitleştirmeye yardımcı olur ve derleyicinin daha fazla iyileştirme gerçekleştirmesini sağlar.

Açıklamalar

  • Aşağıdakiler durumunda bir işlev oluşturmaz olarak kabul edilir:
    • açık throw deyimleri yoktur;
    • işlev çağrıları, varsa, yalnızca oluşturma olasılığı düşük işlevleri çağırır: constexpr veya herhangi bir özel durum belirtimi ile işaretlenen ve oluşturma olmayan davranışlar (bazı standart dışı belirtimler dahil).
  • 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.
  • olarak constexpr işaretlenmiş işlevlerin özel durumlara neden olmaması gerekir ve çözümlenmez.
  • Kural lambda ifadeleri için de geçerlidir.
  • Mantık özyinelemeli çağrıları potansiyel olarak oluşturmaz olarak değerlendirmez. Bu mantık gelecekte değişebilir.

Örnek

Yok edici dışındaki tüm işlevler noexcept eksik olduğundan uyarır.

struct S
{
    S() {} // C26455, Default constructor may not throw. Declare it 'noexcept'
    ~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() noexcept {}
    ~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*/}
};