是的,这是编译器错误。函数指针必须具有兼容的异常说明符才能赋值。
引用标准:
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
规范。所以最好的做法是(并且曾经) -避免使用它。