gcc中的模板显式实例化(定义和声明)

时间:2014-02-25 13:59:07

标签: c++ templates gcc c++11 explicit-instantiation

假设有这样的代码:

template <typename T>
CLASS_KEY1 X{};

PREFIX template CLASS_KEY2 X<int>;

其中CLASS_KEY1CLASS_KEY2PREFIX是宏。 CLASS_KEY1CLASS_KEY2可能会扩展为classstructunion个关键字。 PREFIX可能会展开为空字符集或extern关键字。

下面的表格显示了这些代码为所有宏值组合编译(Yes - 编译,No - 不编译)的时间(编译器gcc-4.8.1,选项{{1 }}):

-std=c++11

是gcc中的错误还是标准要求(奇怪的情况下标有问号)?其他编译器怎么样?

1 个答案:

答案 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条),并且classstruct class-key 应用于指代class(第9条)使用classstruct 类密钥宣布。

因此,您所看到的行为是允许的。