İstisna belirleyicileri kullanımdan kaldırıldı çünkü istisna belirleyicileri genellikle berbat bir fikirdir . noexcept
bir istisna tanımlayıcının makul derecede kullanışlı bir kullanımı olduğu için eklendi: bir işlevin ne zaman olmayacağını bilmek bir özel durum. Böylece ikili bir seçim haline gelir: fırlatacak fonksiyonlar ve fırlatmayacak fonksiyonlar.
noexcept
daha güçlü throw()
olduğu noexcept
için hariç tüm atış belirleyicilerini kaldırmak yerine eklendi . noexcept
derleme zamanının bir boolean'a dönüştüğü bir parametreye sahip olabilir. Boole değeri doğruysa, noexcept
çubuklar. Boolean yanlışsa, noexcept
yapışmaz ve işlev atabilir.
Böylece şuna benzer bir şey yapabilirsiniz:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
Does CreateOtherClass
atmak istisnalar? Bu takdirde, belki T
bireyin varsayılan yapıcı can. Nasıl söyleriz Bunun gibi:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
Böylece, CreateOtherClass()
belirtilen türün varsayılan yapıcısı atarsa atar. Bu, istisna tanımlayıcılarla ilgili en büyük sorunlardan birini düzeltir: çağrı yığınını yayamama.
Bunu ile yapamazsınız throw()
.
noexcept
çalışma zamanı kontrolleri de gerekebilir. Aralarındaki temel fark,noexcept
nedenleristd::terminate
kırarkenthrow
nedenleri kırmaktırstd::unexpected
. Ayrıca bu durumlarda biraz farklı bir yığın çözme davranışı.