İstisna belirleyicileri kullanımdan kaldırıldı çünkü istisna belirleyicileri genellikle berbat bir fikirdir . noexceptbir 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.
noexceptdaha güçlü throw()olduğu noexceptiçin hariç tüm atış belirleyicilerini kaldırmak yerine eklendi . noexceptderleme zamanının bir boolean'a dönüştüğü bir parametreye sahip olabilir. Boole değeri doğruysa, noexceptçubuklar. Boolean yanlışsa, noexceptyapışmaz ve işlev atabilir.
Böylece şuna benzer bir şey yapabilirsiniz:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
Does CreateOtherClassatmak istisnalar? Bu takdirde, belki Tbireyin 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,noexceptnedenleristd::terminatekırarkenthrownedenleri kırmaktırstd::unexpected. Ayrıca bu durumlarda biraz farklı bir yığın çözme davranışı.