或多或少限制的例外规范

时间:2013-02-13 17:38:55

标签: c++

基于this

  

顺便说一句,你可以做一种指向a的指针   只要目标的异常规范不再存在就起作用   比来源的限制

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

问题>为什么呢?

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

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

  

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

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