0

これに基づい

ちなみに、ターゲットの例外仕様がソースの例外仕様よりも制限的でない限り、この種の関数へのポインタの割り当てを行うことができます。

class A{};
class B{};
class C{};

void f() throw(A,B,C) {}

void (*pf)() throw(A,B);

int main()
{
    pf = f; // pf is more restrictive than that of f. I expect an error here!
}

最後のステートメントはコンパイラーを通過させてはなりません。ただし、VS2010とGCCの最新バージョンを試しました。どちらも、彼らはそれについて不平を言いません。

質問>なぜですか?

4

2 に答える 2

1

これは GCC と VS2010 のバグのようです。Clang はそれをコンパイルしません。次のようにコンパイルするべきではありません[except.spec]/5

... 同様の制限が、関数へのポインターの代入と初期化、メンバー関数へのポインター、および関数への参照に適用されます。ターゲット エンティティは、少なくとも、代入または初期化でソース値によって許可された例外を許可する必要があります。

この規格には、次の例も含まれています。

class A { /*...*/ };
void (*pf1)(); // no exception specification
void (*pf2)() throw(A);
void f() {
    pf1 = pf2; // OK: pf1 is less restrictive
    pf2 = pf1; // error: pf2 is more restrictive
}
于 2013-02-13T18:16:06.640 に答える
1

これは g++ の長年のバグです: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12255

根本的な問題は、G++ が非関数宣言の例外仕様を無視することです。この選択は、例外仕様が宣言に関連付けられたままではなく、関数型の一部になるかどうかについての不確実性に端を発していると思います。

この点でVSが似ていたとしても、私は驚かないでしょう。

于 2013-02-13T18:20:14.883 に答える