5

この同様の不運な質問 には、コメントと短い回答がありましたが、終了する前に、次のように述べています。ここで、C++ 標準がそのように定義されているという証拠を求めています。

gcc 4.8.1 と clang 3.3 は同様に、デフォルトの診断オプションまたはより厳密なオプションを使用すると、次のようなコードの追加の修飾または明示的な修飾に対してエラーが発生します。

struct x
{
    int x::i; // Error: gcc/clang: "extra"
};

int ::y; // Error: gcc: "explicit", clang: "extra"

gcc は v4.1 以降、このようなエラーを診断しています。しかし、一般的なコンパイラは、これらのエラーについて全会一致ではありません。MSVC++ 2012 (Nov CTP) ではエラーint ::y;が発生しますが、エラーが発生した場合でも、/Wall診断はまったく行われません。これは int x::i;、不運な質問者が提起したようなケースであり、その違いは、MS コンパイラの作成者による審議を示唆しています。

これらのエラーは、標準によってどのように保証されますか? C++11 標準への参照で十分です。

答えは「彼らは文法に従っている」かもしれません。その場合、それらがどのように文法に従っているかを示すようにしてください。標準の文法分類を自由に使用してください。コピーを持っているので、説明を理解するために読み直します。

4

2 に答える 2

5

C++ の修飾名は常に、以前に宣言された名前を参照する必要があります。これは、8.3 節および 3.4.3.2 節で指定されています。

最初に修飾名を使用して変数またはメンバーを宣言することはできません。「識別子を解決できません」のようなコンパイラ エラーが発生します。このような修飾子は、再宣言に使用するように設計されています。したがって、これらの名前は以前に宣言されたエンティティを見つける必要があるという要件があります。

于 2013-08-06T20:52:55.510 に答える