自动销毁静态对象

bit*_*ask 7 c++ templates static-members

为什么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;
}
Run Code Online (Sandbox Code Playgroud)

我原本以为在执行时我会看到CTOR后跟的字符串DTOR.虽然我没有.我在这里错过了什么?

它与dump成为模板类型的成员有关,但就我而言.

Mat*_* M. 5

我在§14.7.1隐式实例化中找到了一些东西.

1 / [...]类模板特化的隐式实例化导致类成员函数,成员类,作用域成员枚举,静态数据成员和成员的声明的隐式实例化,而不是定义或默认参数的隐式实例化.模板.[...]

它继续在第二个说明中:

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

因此,除非您使用它,否则不应将其实例化.这不是优化,只是标准[n3092]一致性.