6

我们有以下代码

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

void f() { }

GCC 和 clang 可以很好地编译它。但是,在标准中有这样一段:

n3376 15.4/4

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

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

void f() throw(int);

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

void f() { }

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

4

1 回答 1

2

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

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

void f() { }

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

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

我希望你能理解我的英语,对此感到抱歉。

于 2013-02-20T01:24:27.880 回答