Exception Bezeich wurden, weil exception specifiers are generally a terrible idea veraltet. noexcept
wurde hinzugefügt, weil es die sinnvoll sinnvolle Verwendung eines Ausnahme-Spezifizierers ist: Wissen, wann eine Funktion nicht eine Ausnahme auslöst. So wird es eine binäre Wahl: Funktionen, die werfen werden und Funktionen, die nicht werfen werden.
noexcept
wurde hinzugefügt, anstatt nur alle throw specifiers außer throw()
zu entfernen, da noexcept
leistungsfähiger ist. noexcept
kann einen Parameter haben, dessen Kompilierungszeit in einen booleschen Wert aufgelöst wird. Wenn der Boolesche Wert wahr ist, bleibt der noexcept
kleben. Wenn der Boolesche Wert falsch ist, bleibt der noexcept
nicht haften und die Funktion kann werfen.
So können Sie etwas tun:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
Hat CreateOtherClass
Wurf Ausnahmen? Es könnte, wenn der Standardkonstruktor T
kann. Wie erzählen wir? Wie folgt aus:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
So CreateOtherClass()
wird werfen iff die Standard-Konstruktor angegebenen Typ wirft. Dies behebt eines der Hauptprobleme mit Ausnahmespezifizierern: ihre Unfähigkeit, den Aufrufstapel weiterzuleiten.
Sie können dies nicht mit throw()
tun.
Nach diesem [schönen Artikel] (http://akrzemi1.wordpress.com/2011/06/10/using-noexcept/) kann auch 'noexcept' Laufzeitüberprüfungen verursachen. Der Hauptunterschied zwischen ihnen ist, dass das Brechen von 'noexcept' 'std :: terminate' verursacht, während das Brechen von' throw' 'std :: unexpected' verursacht. Auch ein etwas anderes Stapelabwickelverhalten in diesen Fällen. – Fiktik