实例化模板是否实例化其静态数据成员?
关于显式实例化(当模板在头文件中声明并在cpp文件中定义时使用IIRC,否则链接器在其他位置使用时无法找到它),如果模板有静态成员变量,将显式实例化还实例化并创建静态成员变量?
如果您明确实例化类模板,则所有非模板成员都将被实例化,包括static
数据成员,只要它们也具有定义。 例如:
template <typename T>
struct foo {
static int static_data;
void non_template_member() {}
template <typename S>
void template_member(S) {}
};
template <typename T>
int foo<T>::static_data = 0;
template struct foo<int>;
template struct foo<double>;
底部的显式实例为int
和double
类型创建static_data
和non_template_member()
定义。 template_member(S)
没有定义,因为它仍然是一个开放的集合。
如果您没有为static_data
提供[模板化]定义,则不会实例化相应的定义。
该标准的相关部分是14.7.2 [temp.explicit]第8段:
命名类模板专门化的显式实例化也是其每个成员(不包括从基类继承的成员和作为模板的成员)的相同类型(声明或定义)的显式实例,这些成员之前并未明确专用该翻译单元包含明确的实例,除了下面描述的内容。
如果没有成员定义,则只声明static
成员,而显式实例化只会看到被实例化的声明。 通过定义,显式实例化成为一个定义。
类模板的显式实例化也实例化静态数据成员。 根据C ++ 11,[temp.explicit] / 8:
命名类模板专门化的显式实例化也是其每个成员(不包括从基类继承的成员)的相同种类(声明或定义)的显式实例化,这些成员之前并未明确专用于包含显式实例化,除非如下所述。 [注意:另外,它通常是一个关于类的特定实现相关数据的显式实例化。 - 注意]
“下面描述”的情况都不适用于静态数据成员。
链接地址: http://www.djcxy.com/p/79875.html上一篇: Does instantiating a template instantiate its static data members?
下一篇: like calls in R