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

时间:2013-02-19 05:23:01

标签: c++ c++11 g++ clang++

我们有以下代码

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

void f() { }

GCC和clang汇编得很好。但是,在标准中有这样的段落:

n3376 15.4 / 4

如果函数的任何声明具有异常规范,那么它不是noexcept规范允许的 所有异常,该函数的所有声明(包括定义和任何显式特化)都应具有兼容的异常规范

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

void f() throw(int);

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

void f() { }

为什么这些片段有所不同?感谢。

1 个答案:

答案 0 :(得分:2)

来自std规范的n3376 15.4 / 4,函数的所有声明和定义必须具有相同的投掷类型。在这里:

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

void f() { }

声明void f() throw(int);和定义void f() { }在全球范围内。因此它们存在冲突,因为声明是针对一个函数,它抛出int而定义是针对没有throw规范的函数。

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

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