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;}();