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成为模板类型的成员有关,但就我而言.
我在§14.7.1隐式实例化中找到了一些东西.
1 / [...]类模板特化的隐式实例化导致类成员函数,成员类,作用域成员枚举,静态数据成员和成员的声明的隐式实例化,而不是定义或默认参数的隐式实例化.模板.[...]
它继续在第二个说明中:
2 /除非已明确实例化或明确专门化类模板或成员模板的成员,否则在要求成员定义存在的上下文中引用特化时,将隐式实例化成员的特化; 特别是,除非静态数据成员本身以需要静态数据成员的定义存在的方式使用,否则不会发生静态数据成员的初始化(以及任何相关的副作用).
因此,除非您使用它,否则不应将其实例化.这不是优化,只是标准[n3092]一致性.
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |