8

次のプログラムは、常に「Error:double 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させた後に呼び出しで終了する必要があります。 つまり、例外仕様を使用しないでください。それらは推奨されておらず、役に立ちません。doublefun1

于 2013-06-20T13:55:16.843 に答える
3

MSVC はthrow(int)単に「何でもスローできる」という意味として扱います。つまり、 と同等です。例外仕様 (MSDN)throw(...)を参照してください。

これは C++03 標準に準拠していませんが、実際には C++03 の動作よりも便利であり、C++11 標準の精神に近いものです。

C++11throw(X)では非推奨です。例外指定の新しい形式はnoexceptandであり、 noexcept(true)orであり、 MSVC がサポートするすべてのand とnoexcept(false)同等です。throw()throw(...)

古いスタイルの例外仕様を使用する場合は、throw()「スローしない」と言って何もしないかthrow(...)、「スローする可能性がある」と言って、 を使用しないでくださいthrow(X)。これは、C++03 と C++11、およびすべてのコンパイラで一貫して機能します。

于 2013-06-20T14:39:38.383 に答える