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

C++ 实例化模板是否实例化其静态数据成员?,c++,templates,C++,Templates,关于显式实例化(当模板在头中声明并在cpp文件中定义时使用IIRC,因为否则链接器在其他地方使用时将无法找到它),如果模板具有静态成员变量,显式实例化还会实例化并创建静态成员变量吗?类模板的显式实例化也会实例化静态数据成员。根据C++11,[temp.explicit]/8: 命名类模板专门化的显式实例化也是 其每个成员的相同种类(声明或定义)(不包括从base继承的成员) 类)之前未在包含显式 实例化,除非如下所述。[注:此外,它通常是 有关该类的特定实现相关数据。-结束说明] 并且“下面描述

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

类模板的显式实例化也会实例化静态数据成员。根据C++11,[temp.explicit]/8:

命名类模板专门化的显式实例化也是 其每个成员的相同种类(声明或定义)(不包括从base继承的成员) 类)之前未在包含显式 实例化,除非如下所述。[注:此外,它通常是 有关该类的特定实现相关数据。-结束说明]


并且“下面描述的”情况都不适用于静态数据成员。

如果显式实例化类模板,则所有非模板成员都将被实例化,包括
静态
数据成员,只要它们也有定义。例如:

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>;
模板
结构foo{
静态int静态u数据;
无效的非\u模板\u成员(){}
模板
无效模板_成员{}
};
模板
int foo::static_data=0;
模板结构foo;
模板结构foo;
底部的显式实例化为类型
int
double
创建
静态数据
非模板成员()的定义。由于这仍然是一个开放集,因此不会有
模板成员的定义

如果您没有为
静态\u数据
提供[templated]定义,它将不会实例化相应的定义

本标准的相关章节为14.7.2【临时明确】第8段:

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


没有成员定义,
静态
成员只被声明,显式实例化只会看到声明被实例化。有了这个定义,显式实例化就变成了一个定义。

为什么不试试看呢?O_o@TonyD因为这可能会给出OP使用的编译器和链接器及其错误的具体答案?@Angew:是的-'因为编译器和链接器都充满了错误。@TonyD在所有不太常见的情况和极端情况下严格遵循标准的错误?也许没有“谜语”,但这远非闻所未闻。