Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板的静态成员_C++_Templates_C++11 - Fatal编程技术网

C++ 模板的静态成员

C++ 模板的静态成员,c++,templates,c++11,C++,Templates,C++11,有一个类似的问题,但它与带有typename关键字的模板有关 给定一个模板: template < int X, char Y > struct foo { char myArray[ X <= 0 ? 1 : X ]; static const char Z = Y; } 模板 结构foo { char myArray[X根据模板参数传递的值,分配给那里的静态常量成员会发生变化。请将其缩短为以下内容: template<int X> struct

有一个类似的问题,但它与带有
typename
关键字的模板有关

给定一个模板:

template < int X, char Y >
struct foo
{
    char myArray[ X <= 0 ? 1 : X ];
    static const char Z = Y;
}
模板
结构foo
{

char myArray[X根据模板参数传递的值,分配给那里的静态常量成员会发生变化。请将其缩短为以下内容:

template<int X>
struct foo { 
    static const int value = X;
};
模板
结构foo{
静态常数int值=X;
};

您不会期望
foo::value
等于
foo::value
吧?这通常用于模板元编程,因为该静态常量的值取决于模板参数。

分配给它的静态常量成员根据模板参数传递的值而变化。将其缩短为以下内容:

template<int X>
struct foo { 
    static const int value = X;
};
模板
结构foo{
静态常数int值=X;
};

您不会期望
foo::value
等于
foo::value
吧?这通常用于模板元编程,因为该静态常量的值取决于模板参数。

事实上,您定义的模板参数是非类型参数,而不是其他两种模板参数参数:类型参数和模板参数

但是,它们仍然是模板参数,对于每一组不同的模板参数,您将获得一个全新的数据类型。例如,
foo
是与
foo
不同的数据类型,后者也不同于
foo
,等等

因此,静态成员也会为每个模板参数的选择分别分配和初始化

在这方面,非类型参数、类型参数和模板参数都以相同的方式工作


参考标准(C++11):

(§14.7/6)从模板实例化的每个类模板专用化都有自己的任何静态成员副本。[示例:

template<class T> class X {
  static T s;
};
template<class T> T X<T>::s = 0;
X<int> aa;
X<char*> bb;
模板类X{
静态T-s;
};
模板tx::s=0;
X aa;
xBB;
X
具有类型为
int
的静态成员
s
X
具有类型为
char*
的静态成员
s
-结束示例]

上述标准给出的示例涉及类型参数,但第14.7/6节是模板一般性讨论的一部分。更广泛的上下文表明,这适用于使用非类型参数(或类型、非类型和模板参数的组合)的模板

还有一节是关于模板实例化的类型等价性的,它解释了在什么情况下,具有非类型参数的模板实例化被认为是等价的(我强调的相关部分):

(§14/1)如果
-它们的模板名称、运算符函数ID或文本运算符ID引用同一模板,并且
-它们对应的类型模板参数是相同的类型和
-它们对应的整型或枚举型非类型模板参数具有相同的值和
-它们对应的指针类型的非类型模板参数引用相同的外部对象或函数,或者是空指针值和
-它们对应的指向成员类型的指针的非类型模板参数引用同一个类成员,或者同时是null成员指针值和
-它们对应的引用类型的非类型模板参数引用相同的外部对象或函数,
-它们对应的模板参数引用同一模板


在上下文中,这意味着同一类模板的两个实例化构成两种不同的数据类型,即使它们仅在单个非类型参数的值上不同。

实际上,您定义的模板参数是非类型参数,而不是其他两种类型的模板参数:类型参数和模板参数电子参数

但是,它们仍然是模板参数,对于每一组不同的模板参数,您将获得一个全新的数据类型。例如,
foo
是与
foo
不同的数据类型,后者也不同于
foo
,等等

因此,静态成员也会为每个模板参数的选择分别分配和初始化

在这方面,非类型参数、类型参数和模板参数都以相同的方式工作


参考标准(C++11):

(§14.7/6)从模板实例化的每个类模板专用化都有自己的任何静态成员副本。[示例:

template<class T> class X {
  static T s;
};
template<class T> T X<T>::s = 0;
X<int> aa;
X<char*> bb;
模板类X{
静态T-s;
};
模板tx::s=0;
X aa;
xBB;
X
具有类型为
int
的静态成员
s
X
具有类型为
char*
的静态成员
s
-结束示例]

上述标准给出的示例涉及类型参数,但第14.7/6节是模板一般性讨论的一部分。更广泛的上下文表明,这适用于使用非类型参数(或类型、非类型和模板参数的组合)的模板

还有一节是关于模板实例化的类型等价性的,它解释了在什么情况下,具有非类型参数的模板实例化被认为是等价的(我强调的相关部分):

(§14/1)如果
-它们的模板名称、运算符函数ID或文本运算符ID引用同一模板,并且
-它们对应的类型模板参数是相同的类型和
-它们对应的整型或枚举型非类型模板参数具有相同的值和
-他们的