宣言を使用した名前空間(GCC/VS2010のバグ)?
-
27-09-2019 - |
質問
namespace A{
int i;
}
int main(){
using A::i;
using A::i;
}
vs2010-正常にコンパイル
GCC(IDEONE) - 正常にコンパイルします
comeau-エラー「comeautest.c」、行10:エラー: "i"は、:: i; "を使用して現在の範囲で既に宣言されています。
$ 7.3.3/8-「使用を使用することは宣言であるため、複数の宣言が許可されている場所(および場所のみ)を繰り返し使用できます。」
そこにある例は、コードが実際に不調であることを示しています。
それで、これはGCCとVS2010のバグですか?
編集2:
倍数を削除します using directives
手元のクエリとは無関係であったためです。
解決
参照する例 一貫性がないことが知られています. 。委員会はまだこれを修正していません。
それで、これはGCCとVS2010のバグですか?
GCC/VS2010/ClangまたはComeauのいずれのバグだとは思いません。 C ++標準のバグのようです。これらの場合、コンパイルライターは最も実行可能なことについて決心しなければなりません。問題の例を削除する場合、3.3/4の状態では、例は有効です。「それぞれが同じ資格のない名前を指定する単一の宣言領域に一連の宣言が与えられます。 、またはすべて関数と関数テンプレートを参照します;または...」。
リンクされた問題で説明されているように、7.3.3/8が「宣言」と書かれたときに言及していることは、委員会がコンセンサスに到達しなかったものを指します。したがって、それまで3.3/4はGCC/VS2010とClangに適用されますが、Comeauは他のセマンティクスを使用することを選択します。
他のヒント
はい、あなたは正しいです。これは確かにG ++、MSVC ++、およびClangのバグです。コモーはそれを正しく持っています。
あなたが言ったように 7.3.3/8
言う
使用法は宣言であるため、複数の宣言が許可されている場所(およびどこでのみ)を繰り返し使用できます
次のコードスニペットも与えられます。
void f()
{
using A::i;
using A::i; //error: double declaration
}
同様に、コードも不調です。