例外规范或多或少具有限制性

Exception Specification more or less restrictive

本文关键字:限制性 或多或少      更新时间:2023-10-16

基于此

顺便说一句,您可以对函数,只要目标的异常规范不再存在比来源的更严格

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在这方面相似,我也不会感到惊讶。