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 noexcept
iş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
vestd::swap
.
gibi
throw()
standart olmayan ve güncel olmayan tanımlayıcılar iledeclspec(nothrow)
eşdeğernoexcept
değildir.Açık tanımlayıcılar
noexcept(false)
venoexcept(true)
uygun şekilde dikkate alınıyor.
Örnek
Araç, eksik noexcept
olduğ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*/}
};