例外规范或多或少具有限制性
Exception Specification more or less restrictive
基于此
顺便说一句,您可以对函数,只要目标的异常规范不再存在比来源的更严格
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的最新版本。双方都不抱怨。
问题>为什么?
这看起来像GCC和VS2010中的一个bug。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
}
这是g++中一个长期存在的错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12255
根本问题是G++忽略了非函数声明。我认为这个选择源于不确定性关于exeception规范是否会成为函数类型,而不是与声明保持关联。
如果VS在这方面相似,我也不会感到惊讶。