实例化模板是否实例化其静态数据成员?

关于显式实例化(当模板在头文件中声明并在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>;

底部的显式实例为intdouble类型创建static_datanon_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