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

For*_*veR 6 c++ g++ c++11 clang++

我们有以下代码

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

void f() { }
Run Code Online (Sandbox Code Playgroud)

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

n3376 15.4/4

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

以下示例:gcc - 错误,clang - 警告

void f() throw(int);

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

void f() { }
Run Code Online (Sandbox Code Playgroud)

为什么这些片段有区别?谢谢.

小智 3

std 中的 n3376 15.4/4 指定函数的所有 d\xc3\xa9 声明和定义必须具有相同的抛出类型。这里 :

\n\n
void f() throw(int);\nint main()\n{\n  f();\n  return 0;\n}\n\nvoid f() { }\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

现在,当您将声明放在主范围中时,定义不在同一范围中,在此范围内定义未知,因此您可以编译。

\n\n

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

\n