6

次のコードがあります

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

void f() { }

GCC と clang はそれをうまくコンパイルします。しかし、標準には次のような段落があります。

n3376 15.4/4

関数の宣言に、すべての例外を許可する noexcept-specification ではないexception-specification がある場合、その関数の定義と明示的な特殊化を含むすべての宣言には、互換性のある exception-specification が必要です。

次の例: 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() { }はグローバルスコープにあります。したがって、宣言は int をスローする関数用であり、定義はスロー仕様のない関数用であるため、競合しています。

ここで、宣言をメインのスコープに入れると、定義は同じスコープにありません。このスコープの間、定義は不明であるため、コンパイルできます。

私の英語を理解していただければ幸いです。申し訳ありません。

于 2013-02-20T01:24:27.880 に答える