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

use*_*506 7 c++ templates

关于显式实例化(当模板在头文件中声明并在cpp文件中定义时使用的IIRC,因为否则链接器在其他地方使用它时将无法找到它),如果模板具有静态成员变量,则将显式实例化还实例化并创建静态成员变量?

Die*_*ühl 3

如果显式实例化类模板,则所有非模板成员都将被实例化,包括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>;
Run Code Online (Sandbox Code Playgroud)

底部的显式实例化为类型static_data和创建定义。不会有定义,因为这仍然是一个开放集。non_template_member()intdoubletemplate_member(S)

如果您不提供 [模板化] 定义static_data,它将不会实例化相应的定义。

标准的相关部分是 14.7.2 [temp.explicit] 第 8 段:

命名类模板特化的显式实例化也是其每个成员(不包括从基类继承的成员和模板成员)的同类(声明或定义)的显式实例化,这些成员之前尚未显式特化包含显式实例化的翻译单元,除非如下所述。

如果没有成员定义,static则仅声明成员,并且显式实例化只会看到声明被实例化。通过定义,显式实例化就变成了定义。