2
#include "iostream"
#include "conio.h"
#include "exception"
#include "cstdlib"
using namespace std;

void myunexpected () 
{
    cerr << "unexpected called\n";
    throw 0;     // throws int (in exception-specification)
}

void myfunction () throw (int) 
{
    throw 'x';   // throws char (not in exception-specification)
}

int main (void) 
{
    set_unexpected (myunexpected);
   try 
   {
      myfunction();
   }
   catch (int) { cerr << "caught int\n"; }
   catch (...) { cerr << "caught other exception (non-compliant compiler?)\n"; }
   getch();
   return 0;
}

出力(Visual Studio 2008で実行した場合):他の例外をキャッチしました(非準拠のコンパイラ?)

しかし、私は出力が次のようになることを期待していました。

予期せぬ呼ばれる

キャッチされたint

注:このプログラムはVisualStudio2008で実行しました。

4

1 に答える 1

2

はい、標準に従って、出力は[#1]である必要があります:

予期しない呼び出さ
れたint

gccは正確な結果を提供します。

MSVCは、例外仕様を処理する際にバグがあることで有名です。例外仕様は失敗した実験と見なされます。
AFAIK、MSVCは、空の仕様(throw()/ nothrow)を除いて、例外仕様を実装していません。

C ++ 03標準:

[#1] 15.5.2unexpected()関数[except.unexpected]

関数はunexpected()戻りませんが、例外をスロー(または再スロー)することができます。以前に違反した例外仕様で許可されている新しい例外がスローされた場合、別のハンドラーの検索は、例外仕様に違反した関数の呼び出しで続行されます。

于 2012-04-07T18:07:03.373 に答える