具有不同实例化的静态模板类变量是否相同?

The*_*ist 6 c++ static templates static-members

说我上课了

template <typename T>
class MyClass
{
    static int myvar;
}
Run Code Online (Sandbox Code Playgroud)

现在,以下任务将会发生什么?

MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;
Run Code Online (Sandbox Code Playgroud)

根据标准会发生什么?我会有两个版本的MyClass :: myvar还是只有一个?

Luc*_*ore 7

是的,将有两个具有两个不同值的变量.但那是因为这两个是完全不相关的类.这就是模板的工作原理.不要将它们视为类,而应将其视为构建类之后的一组规则.


Sha*_*our 2

由于OP特别要求标准的报价,这是我的答案,其中包括标准的相关报价。

\n\n

每个专业都有自己的副本,myvar这是有意义的,因为每个专业都有自己独特的类别。C++ 标准草案14.7 模板实例化和专业化第6段中说(重点是我的):

\n\n
\n

从模板实例化的每个类模板专业化都有其自己的静态成员副本

\n\n
 [ Example:\n template<class T> class X {\n     static T s;\n };\n template<class T> T X<T>::s = 0;\n X<int> aa;\n X<char*> bb;\n
Run Code Online (Sandbox Code Playgroud)\n\n

X 有一个 int 类型的静态成员,并且 X 有一个 char* 类型的静态成员。\xe2\x80\x94end\n 示例]

\n
\n