4

コード:

#include<iostream>
using namespace std;

void foo() throw(char) {throw 'a';}

int main() try {

   void (*pf)() throw(float);
   pf = foo; // This should NOT work 
   pf();

}
catch(const char& c){cout << "Catched ::> " << c << endl;}

例外の仕様が関数ポインタの仕様と異なっていfoopfも、なぜ渡すことができるのですか?これは私のコンパイラのバグですか?foopf

4

2 に答える 2

9

例外仕様は関数の型には関与しません。 訂正:他の回答で指摘されているように、それは確かにコンパイラのバグです。ほとんどのコンパイラが例外仕様の実装にバグがあることはよく知られている事実です。また、C++11では非推奨になりました。それで、

例外仕様を使用して、ハーブサッターのアドバイスに従ってください。

道徳#1:例外仕様を書かないでください。

道徳#2:おそらく空のものを除いて、しかし私があなたならそれさえ避けたいでしょう。

于 2012-10-29T16:17:10.633 に答える
5

はい、これはコンパイラのバグです。関数ポインタを割り当てるには、互換性のある例外指定子が必要です。

標準からの引用:

15.4例外仕様

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

例:

class A;

void (*pf1)(); // no exception specification
void (*pf2)() throw(A);

pf1 = pf2; // OK: pf1 is less restrictive
pf2 = pf1; // error: pf2 is more restrictive

Comeauでコンパイルされたコードはincompatible exception specificationsエラーになります:

Comeau C/C++ 4.3.10.1 (Oct  6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing.  All rights reserved.
MODE:strict errors C++ C++0x_extensions

"ComeauTest.c", line 9: error: incompatible exception specifications
  pf=foo; // This should NOT work 
    ^

他の多くの人が言及したように、例外仕様は、仕様を除いてC ++ 11標準(付録D.4を参照)で非推奨になっていnoexceptます。したがって、ベストプラクティスは(そしてそうであった)-それを使用することは避けてください

于 2012-10-29T16:36:45.820 に答える