prescrittori di eccezione sono stati deprecati a causa exception specifiers are generally a terrible idea. noexcept
è stato aggiunto perché è l'unico uso ragionevolmente utile di uno specificatore di eccezioni: sapere quando una funzione non genera un'eccezione. Diventa quindi una scelta binaria: funzioni che getteranno e funzioni che non getteranno.
noexcept
è stato aggiunto anziché rimuovere tutti gli identificatori di lancio diversi da throw()
perché noexcept
è più potente. noexcept
può avere un parametro che compila in tempo risolve in un booleano. Se il valore booleano è true, le spille noexcept
. Se il valore booleano è falso, lo noexcept
non si attacca e la funzione può essere lanciata.
Così, si può fare qualcosa di simile:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
Does CreateOtherClass
generano eccezioni? Potrebbe, se il costruttore predefinito di T
può. Come lo diciamo? Come questo:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
Così, CreateOtherClass()
getteranno se e solo se il costruttore predefinito del tipo specificato getta. Questo risolve uno dei problemi principali con gli specificatori di eccezioni: la loro incapacità di propagare lo stack di chiamate.
Non è possibile farlo con throw()
.
fonte
2012-10-11 06:23:36
Per questo [bell'articolo] (http://akrzemi1.wordpress.com/2011/06/10/using-noexcept/) anche 'noexcept' può incorrere in controlli di runtime. La principale differenza tra loro è che l'interruzione di 'noxcept' causa' std :: terminate' mentre l'interruzione di 'throw' causa' std :: unexpected'. In questi casi anche un comportamento di svolgimento leggermente diverso. – Fiktik