これに関する2つの質問:
指定子を強制的
g++
に無視する方法はありthrow
ますか?
(たとえば、私が覚えているように、Visual Studio は とは異なり、スロー指定子を無視しますthrow()
)スロー指定子が正しいかどうかを強制的
g++
にチェックすることは可能ですか?つまり、スロー指定子を持つ関数が関数を呼び出すかどうかをチェックすることです(これはワンパスコンパイラで実行できます)。指定子とthrow
、指定子に違反する例外の実行を監視しますか? (注:大量の警告が発生する可能性があるため、スロー指定子なしで関数を監視しないでください)
編集: 2 番目の質問にいくつかの例を追加します。
次があるとします。
// sorry for the coding style here, but I don't want it to be unnecessary long
class A { /* .. */ };
class B : public A { /* .. */ };
class C { /* .. */ };
void no_throw_spec() { /* .. */ }
void no_throw_at_all() throw() { /* .. */ }
void throws_A() throw( A ) { /* .. */ }
// this is fine, don't do anything
void f()
{ no_throw_spec(); no_throw_at_all(); throws_A(); }
void g() throw()
{
no_throw_spec(); no_throw_at_all(); // OK
throws_A(); // warning here - throws_A() may throw A, but g() has throw()!
}
void h() throw( A )
{
no_throw_spec(); no_throw_at_all(); throws_A(); // OK
if( /* .. */ )
throw B(); // OK, B inherits A, it's OK
/* .. */
throw C(); // C does not inherit A, so WARNING!
}