はい、これはコンパイラのバグです。関数ポインタを割り当てるには、互換性のある例外指定子が必要です。
標準からの引用:
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
ます。したがって、ベストプラクティスは(そしてそうであった)-それを使用することは避けてください。