19

次のプログラムは、C++ 標準に従って整形式ですか、それとも整形式ではありませんか?

namespace X { int i; }

namespace Y { using X::i; }

int main() { using X::i; using Y::i; }

さまざまなコンパイラでさまざまな結果が得られます。

このプログラムを GCC でコンパイルできるように修正したくありません。これについて C++ 標準が何を述べているのか、および 3 つのコンパイラの動作が異なる理由を知りたいだけです。また、これがこれらのコンパイラのいずれかのバグの結果であるかどうかも知りたいです。

4

2 に答える 2

6

Clang と MSVC は正しいです。このコードは有効です。アルフが指摘しているように、[namespace.udecl] (7.3.3)/10は言う

using-declarationは宣言であるため、複数の宣言が許可されている場所 (および場所のみ) で繰り返し使用できます。

ただし、ブロック スコープ内で同じエンティティを複数宣言することには制限がないため、元の例は有効です。using-declaration を含まない対応するケースは次のとおりです。

int n;
void f() {
  extern int n;
  extern int n;
}

これは有効であり (GCC、EDG、Clang、および MSVC で受け入れられます)、したがって (上記のルールにより) 元の例も有効です。

[namespace.udecl] (7.3.3)/10の例にはエラーが含まれていることに注意してください。それは言います:

namespace A {
  int i;
}

void f() {
  using A::i;
  using A::i; // error: double declaration
}

...しかし、コメントは正しくありません。2 番目の宣言にはエラーはありません。コアイシュー 36の議論を参照してください。これ以上多くの人を混乱させないように、この例を標準から削除しました。

于 2015-07-05T20:16:02.297 に答える