异常规范在声明和功能实现方面不兼容

Exception specifications are not compatible in declaration and in realisation of function

本文关键字:功能 实现 方面 不兼容 声明 异常      更新时间:2023-10-16

我们有以下代码

int main()
{
  void f() throw(int);
  f();
  return 0;
}
void f() { }

GCC和clang编译得很好。但是,在标准中有这样一段话:

n3376 15.4/4

如果函数的任何声明具有异常规范,则该异常规范不是允许所有异常,该函数的所有声明,包括定义和任何显式专用化,都应具有兼容的异常规范

对于以下示例:gcc-error,clang-warning

void f() throw(int);
int main()
{
  f();
  return 0;
}
void f() { }

为什么这些片段有差异?谢谢

std中的n3376 15.4/4指定函数的所有声明和定义必须具有相同的抛出类型。此处:

void f() throw(int);
int main()
{
  f();
  return 0;
}
void f() { }

声明CCD_ 1和定义CCD_。因此,它们之间存在冲突,因为声明是针对抛出int的函数,而定义是针对没有抛出规范的函数。

现在,当你把声明放在主作用域中时,定义不在同一个作用域中,在这个作用域中定义是未知的,所以你可以编译。

我希望你能理解我的英语,很抱歉。