Das folgende Programm gibt immer "Error: double 10.2" aus.
Ich verstehe nicht warum. Laut mir, wenn fun1 () erlaubt nur Int geworfen werden, sollte das Programm entweder (1) Absturz (2) oder ändere das Double zu einem int und wirf es dann. Das heißt, die Ausgabe sollte "Error: int 10" sein. Dies ist jedoch nicht der Fall. Kann mir jemand erklären?
%Vor% Ihr Compiler ist nicht standardkonform. Gemäß Standard sollte Ihr Programm mit dem Aufruf von std::unexpected
enden, nachdem Sie double
Ausnahme-Escaped fun1
erlaubt haben. .
Das heißt - keine Ausnahmespezifikationen verwenden. Sie sind veraltet und nutzlos.
MSVC behandelt throw(int)
als Bedeutung einfach "kann alles werfen", dh entspricht throw(...)
, siehe Ausnahmespezifikationen (MSDN)
Dies entspricht nicht dem C ++ 03-Standard, ist aber tatsächlich nützlicher als das C ++ 03-Verhalten und liegt näher am Geist des C ++ 11-Standards.
In C ++ 11 throw(X)
ist veraltet, die neue Form der Ausnahmespezifikation ist noexcept
und kann noexcept(true)
oder noexcept(false)
sein, was throw()
und throw(...)
entspricht, was alles MSVC ist unterstützt.
Wenn Sie die alten Ausnahmebedingungen verwenden möchten, verwenden Sie einfach throw()
, um "nicht werfen" zu sagen, und nichts oder throw(...)
, um "werfen" zu sagen, und verwenden Sie nicht throw(X)
. Das wird konsistent in C ++ 03 und C ++ 11 und über alle Compiler funktionieren.