假设有这样的代码:
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
关键字。
下表显示了何时为宏值的所有组合(编译器 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 中的错误还是标准要求(奇怪的情况用问号标记)?其他编译器呢?