12
namespace A{
   int i;
}

int main(){
   using A::i;
   using A::i;
}

VS2010 - 正常にコンパイル

gcc (ideone) - 正常にコンパイルされます

Comeau - エラー ""ComeauTest.c"、10 行目: エラー: "i" は、A::i を使用して現在のスコープで既に宣言されています。"

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

右の例は、コードが実際に不正であることを示しています。

では、これは GCC と VS2010 のバグですか?

編集2:

using directives手元のクエリとは無関係だったので、複数を削除します。

4

2 に答える 2

11

あなたが参照している例は、矛盾していることが知られています。委員会はまだこれを修正していません。

では、これは GCC と VS2010 のバグですか?

GCC/VS2010/Clang や Comeau のバグではないと思います。C++ 標準のバグのようです。このような場合、コンパイルの作成者は、何が最も実行可能かを決定する必要があります。問題の例を削除すると、3.3/4 はその例が有効であると述べています。 、またはすべてが関数および関数テンプレートを参照するか、または ...".

リンクされた問題で議論されているように、委員会がコンセンサスに達しなかった「宣言」と言うときに7.3.3/8が何を指しているのかという疑問が生じます。そのため、それまでは 3.3/4 が GCC/VS2010 と Clang に適用されますが、Comeau は他のセマンティクスを使用することを選択します。

于 2010-11-23T23:33:53.813 に答える
1

はい、あなたは正しいです。これは確かに g++、MSVC++、および Clang のバグです。コモーはそれを正しく理解しています。

あなたが言った7.3.3/8ように

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

次のコード スニペットも示します。

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

同様に、コードの形式も正しくありません。

于 2010-11-23T03:25:08.903 に答える