0

基于

顺便说一句,只要目标的异常规范不比源的限制更严格,您就可以对函数的指针进行这种分配

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最新版本。他们都没有抱怨。

问题> 为什么?

4

2 回答 2

1

这看起来像是 GCC 和 VS2010 中的一个错误。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
}
于 2013-02-13T18:16:06.640 回答
1

这是 g++ 中长期存在的错误:http ://gcc.gnu.org/bugzilla/show_bug.cgi?id=12255

根本问题是 G++ 只是忽略了非函数声明的异常规范。我认为这种选择源于关于异常规范是否会成为函数类型的一部分而不是与声明保持关联的不确定性。

如果 VS 在这方面相似,我不会感到惊讶。

于 2013-02-13T18:20:14.883 回答