1

假设有这样的代码:

template <typename T>
CLASS_KEY1 X{};

PREFIX template CLASS_KEY2 X<int>;

其中CLASS_KEY1,CLASS_KEY2PREFIX是宏。CLASS_KEY1并且CLASS_KEY2可以扩展为class,structunion关键字。PREFIX可以扩展为空字符集或extern关键字。

下表显示了何时为宏值的所有组合(编译器 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),class-key应用于引用 a (第 9 条),并且应使用or 或class-key指一个friendenumunion unionclassstruct class(第 9 条)使用classor struct class-key声明。

所以,你看到的行为是允许的。

于 2014-02-25T14:34:22.513 回答