あなたは次のように言う the を破って[basic.scope.pdecl]/6
います:
精緻型指定子で最初に宣言されたクラスの宣言のポイントは次のとおりです
。
class-key attribute-specifier-seqopt identifier ;
識別子は、宣言を含むスコープ内のクラス名であると宣言されています
。
class-key identifier
名前空間スコープで定義された関数の decl-specifier-seq または parameter-declaration-clause で詳しく説明された型指定子が使用されている場合、識別子は、宣言を含む名前空間でクラス名として宣言されます。それ以外の場合、フレンド宣言を除き、識別子は宣言を含む最小の名前空間またはブロック スコープで宣言されます。[ 注: これらのルールはテンプレート内にも適用されます。— 終了注 ] [ 注: 精緻化された型指定子の他の形式は、新しい名前を宣言しないため、既存の型名を参照する必要があります。3.4.4 および 7.1.6.3 を参照してください。— 終了注記]
- 匿名型の変数を作成していません
- あなたはタイプを作成していません
[basic.def]/2
あなたの例が標準に準拠していないことを証明する標準からの別の例( )があります:
struct S { int a; int b; }; // defines S, S::a, and S::b
struct X { // defines X
int x; // defines non-static data member x
static int y; // declares static data member y
X(): x(0) { } // defines a constructor of X
};
int X::y = 1; // defines X::y
enum { up, down }; // defines up and down
namespace N { int d; } // defines N and N::d
namespace N1 = N; // defines N1
X anX; // defines anX
あなたの例は何も定義していません(フィールドにアクセスできない匿名構造体を除く)。
この場合、使用する 2 つの値が導入されるため、列挙に関する例外に注意してください。