8

以下程序始终输出“错误:双 10.2”。

我不懂为什么。根据我的说法,如果 fun1() 只允许抛出 int,则程序应该 (1) 崩溃 (2) 或将 double 更改为 int 然后抛出。这意味着,输出应该是“Error:int 10”。然而,情况并非如此。谁能解释一下??

void fun1() throw (int)
{
    cout<<"3";
    throw 10.2;
    cout<<"4";
}

int main()
{
    try {   fun1(); }
    catch(int i) { cout<<"Error:int" <<i <<endl;}
    catch(double i) { cout << "Error:double" << i << endl; }
    cout << endl;
    return 0;
}
4

2 回答 2

9

您的编译器不符合标准。根据标准,您的程序应该std::unexpected在让double异常逃逸后以调用结束fun1
也就是说 - 不要使用异常规范。它们已被弃用且无用。

于 2013-06-20T13:55:16.843 回答
3

MSVC 将throw(int)其简单地视为“可以抛出任何东西”的意思,即等同于throw(...),请参阅Exception Specifications (MSDN)

这不符合 C++03 标准,但实际上比 C++03 的行为更有用,更接近 C++11 标准的精神。

在 C++11throw(X)中已弃用,新形式的异常规范是noexceptand can be noexcept(true)or noexcept(false),等价于throw()and throw(...),这是 MSVC 所支持的。

如果你想使用旧式的异常规范,只需throw()说“不会抛出”或者什么都没有或throw(...)说“可能会抛出”,不要使用throw(X). 这将在 C++03 和 C++11 以及所有编译器中始终如一地工作。

于 2013-06-20T14:39:38.383 回答