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).
- açık
- gibi
throw()
standart olmayan ve güncel olmayan tanımlayıcılar ile__declspec(nothrow)
eşdeğernoexcept
değildir. - Açık tanımlayıcılar
noexcept(false)
venoexcept(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*/}
};