1

次のようなコードがあるとします。

template <typename T>
CLASS_KEY1 X{};

PREFIX template CLASS_KEY2 X<int>;

ここでCLASS_KEY1CLASS_KEY2PREFIXはマクロです。CLASS_KEY1、またはキーワードにCLASS_KEY2拡張できます。空の文字セットまたはキーワードに展開できます。classstructunionPREFIXextern

マクロ値のすべての組み合わせ (コンパイラ gcc-4.8.1、オプション)について、そのようなコードがいつコンパイルされるか ( Yes- コンパイルされる、No- コンパイルされない)を示す表を次に示します。-std=c++11

PREFIX                                        extern  extern  extern
CLASS_KEY1\CLASS_KEY2 class   struct  union   class   struct  union
class                 Yes     Yes?    No      Yes     Yes?    No
struct                Yes?    Yes     No      Yes?    Yes     No
union                 No      No      Yes     No      No      Yes

これは gcc のバグですか、それとも標準要件ですか (奇妙なケースには疑問符が付いています)。他のコンパイラはどうですか?

4

1 に答える 1

2

C++11 標準のセクション 7.1.6.3 (詳細な型指定子) には次のように記載されています。

詳細型指定子に存在するクラスキーまたはenumキーワードは、詳細型指定子の名前が参照する宣言と種類が一致するものとします。この規則は、クラスの定義を参照していると解釈できるため、クラス名またはクラスを宣言する詳細型指定子の形式にも適用されます。したがって、任意の精巧な型指定子では、キーワードは列挙を参照するために使用され (7.2)、クラス キーは(第 9 節)を参照するために使用され、またはクラス キーのいずれかが使用されるものとします。を参照するfriendenumunion unionclassstruct class(第 9 節) classorを使用して宣言されたstruct class-key

したがって、表示されている動作は許可されています。

于 2014-02-25T14:34:22.513 に答える