Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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_Static Members_Class Template - Fatal编程技术网

C++ 如果不使用静态菜单,静态成员变量是否在模板类中初始化?

C++ 如果不使用静态菜单,静态成员变量是否在模板类中初始化?,c++,templates,static-members,class-template,C++,Templates,Static Members,Class Template,如果不使用静态成员,静态成员变量是否在模板类中初始化?我用它来注册类型 template<class T> class A { static bool d; }; template<class T> bool A<T>::d = [](){regist<A<T>>(); return true;}(); int main() { A<int> a; return 0; } 模板 甲级 { 静态布尔d

如果不使用静态成员,静态成员变量是否在模板类中初始化?我用它来注册类型

template<class T>
class A
{
    static bool d;
};

template<class T> bool A<T>::d = [](){regist<A<T>>(); return true;}();

int main()
{
   A<int> a;
   return 0;
}
模板
甲级
{
静态布尔d;
};
模板bool A::d=[](){regist

#包括
使用名称空间std;
int i=1;
模板
无效注册表()
{
++一,;
}
模板
甲级
{
静态布尔d;
};
模板boola::d=[](){regist();返回true;}();
int main()
{
A A;

cout是的,它已初始化运行此示例程序,但只是因为它被迫存在

template <class T>                                                                 
struct A                                                                           
{                                                                                  
    static int b;                                                                  
};                                                                                 
template <class T> int A<T>::b = 10;                                               
#include <iostream>                                                                
using namespace std;                                                               
int main() {                                                                       
    cout << A<int>::b << endl;                                                     
    return 0;                                                                      
}   
模板
结构A
{                                                                                  
静态int b;
};                                                                                 
模板INTA::b=10;
#包括
使用名称空间std;
int main(){

cout的相关章节位于
14
模板下,即
14.7.1
隐式实例化第2段,其中说明(重点):

除非类模板或成员模板的成员已显式实例化或显式专门化,否则当在要求成员定义存在的上下文中引用专门化时,成员的专门化将隐式实例化;特别是,初始化静态数据成员的(以及任何相关的副作用)不会发生,除非静态数据成员本身的使用方式要求静态数据成员的定义存在。

我们还可以看到第8段,其中说:

类模板的隐式实例化不会导致隐式实例化该类的任何静态数据成员

但是,如果您将显式实例化添加到第二种情况,如下所示,您将看到
2
作为结果:

template<> bool A<int>::d = [](){regist<A<int>>(); return true;}();
template bool A::d=[](){regist();返回true;}();

静态成员用于打印时是另一种情况。@user1899020为什么,如果您使用它,我对这个问题不了解it@aaronmanOP希望变量保持完全未使用状态。他不关心它的值,他只希望初始化的副作用发生。他不希望为C请访问该变量以查看它是否“优化了”。@dasblinkenlight您认为它会被优化掉吗,请查看上面发布的我的测试代码。它打印的是1而不是2。因此静态成员未初始化。您可能需要阅读以获得更清晰的初始化方法(尽管它与您的方法相同)。另一件事是,在您的示例中,您甚至声明了
a
,它的行为与您没有声明的行为相同
template<> bool A<int>::d = [](){regist<A<int>>(); return true;}();