假设有这样的代码:
template <typename T>
CLASS_KEY1 X{};
PREFIX template CLASS_KEY2 X<int>;
其中CLASS_KEY1
,CLASS_KEY2
和PREFIX
是宏。 CLASS_KEY1
和CLASS_KEY2
可能会扩展为class
,struct
或union
个关键字。 PREFIX
可能会展开为空字符集或extern
关键字。
下面的表格显示了这些代码为所有宏值组合编译(Yes
- 编译,No
- 不编译)的时间(编译器gcc-4.8.1,选项{{1 }}):
-std=c++11
是gcc中的错误还是标准要求(奇怪的情况下标有问号)?其他编译器怎么样?
答案 0 :(得分:2)
C ++ 11标准的第7.1.6.3节(详细说明的类型说明符)说:
elaborated-type-specifier 中出现的 class-key 或
enum
关键字应与中的名称一致。 em> elaborated-type-specifier 指。此规则也适用于声明类名或 friend
类的 elaborated-type-specifier 的形式,因为它可以被解释为引用定义班上的。因此,在任何 elaborated-type-specifier 中,enum
关键字应用于引用枚举(7.2),union
class-key 将用于引用union
(第9条),并且class
或struct
class-key 应用于指代class
(第9条)使用class
或struct
类密钥宣布。
因此,您所看到的行为是允许的。