基于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最新版本。他们都没有抱怨它。
问题>为什么呢?
答案 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在这方面相似,我不会感到惊讶。