自动销毁静态对象
Automatic destruction of static object
为什么c++不创建/销毁模板类型的静态成员?
观察下面的例子:
#include <iostream>
struct Dump {
Dump() {
std::cout << "CTOR" << std::endl;
}
~Dump() {
std::cout << "DTOR" << std::endl;
}
};
template <typename T> struct X {
static Dump dump;
};
template <typename T> Dump X<T>::dump;
struct A : X<A> {
};
int main() {
A a;
return 0;
}
我希望在执行时看到字符串CTOR
后面跟着DTOR
。而我没有。我遗漏了什么?
它与dump
是模板类型的成员有关,但这就是我所得到的
我发现§14.7.1隐式实例化
1/[…类模板专门化的隐式实例化导致声明的隐式实例化,但不导致定义或默认实参、类成员函数、成员类、限定作用域的成员枚举、静态数据成员和成员模板的实例化。[…]
第二个音符:
因此,除非你使用它,否则不应该被实例化。这不是优化,只是符合标准[n3092]。2/除非类模板或成员模板的成员已经显式实例化或显式特化,否则当在需要成员定义存在的上下文中引用该特化时,成员的特化将隐式实例化;特别是,静态数据成员的初始化(和任何相关的副作用)不会发生,除非静态数据成员本身以需要存在静态数据成员定义的方式使用。
除非使用,否则不会被实例化。
int main()
{
A a;
(void) a.dump;
}
同时,修复编译错误:
template <typename T> Dump X<T>::dump;
类模板的成员仅在需要时才实例化;在这种情况下,没有任何引用静态成员,因此它没有被实例化,即使类模板本身被实例化。
您将发现,将语句X<A>::dump;
放在某个地方将导致成员被实例化,并创建和销毁对象。
相关文章:
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 我可以读取静态对象中的文件.txt吗?C++
- 通过 Gazebo 世界插件将静态对象附加到机器人链接
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- 完全释放静态对象内存
- 静态对象指针
- C++文件中.cpp静态对象声明
- C++类中定义静态对象
- 在初始化类的静态对象之前,是否保证初始化该类的静态成员?
- 静态对象如何调用私有构造函数
- cpp 静态对象实例化
- 等效于 Java 静态对象类C++
- 我怎么知道C++编译器是否制作线程安全的静态对象代码
- 在dlclose()之前破坏的静态对象
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- c++ 防止类共享静态对象
- 什么时候构造函数为静态对象
- 为什么本地静态对象的初始化使用隐藏的防护标志?