5

次のプログラムは、C++ 標準に従って整形式ですか?

namespace X { class A; }

namespace Y { using X::A; class A {}; }

int main() {}

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

  • gcc はエラーなしでコンパイルします。
  • Visual C++ でエラー C2888: 'X::A': シンボルを名前空間 'Y' 内で定義できません

私のプログラムが違反している C++ 標準の規則は見つかりません。

プログラムの形式が正しい場合、Visual Studio でエラーが発生するのはなぜですか?

プログラムが整形式でない場合、c++ 標準のどの規則に違反し、gcc がエラーを出さないのはなぜですか?

私は自分のプログラムをコンパイルしようとはしていません。C++ 標準に従って整形式であるかどうか、およびテストした 2 つのコンパイラの動作が異なる理由を調べようとしています。

4

2 に答える 2

4

プログラムの形式が悪いと思います。[basic.scope.declarative]/4 言います:

単一の宣言領域内の一連の宣言があり、それぞれが同じ非修飾名を指定している場合、

— それらはすべて同じエンティティを参照するか、すべて関数および関数テンプレートを参照するものとします。また

— ちょうど 1 つの宣言が typedef 名ではないクラス名または列挙名を宣言し、他の宣言はすべて同じ変数または列挙子を参照するか、すべてが関数および関数テンプレートを参照する必要があります。この場合、クラス名または列挙名は隠されています

非修飾名の 2 つの宣言はA、どちらもクラスである異なるエンティティーを参照しています。

(興味深いことに、GCC 6.0 も Clang 3.7 もそのように診断していないようです。どちらも記述されたとおりにコードを受け入れます (同じ名前を持つ 2 つの異なるクラスの宣言を診断しません)。X::A a;の本体に を追加すると、mainClang はの不完全型ですX::A。)

于 2015-07-04T12:31:47.390 に答える