为什么不初始化模板类的这个静态成员?
Why isn't this static member of template class initialized?
template <typename T>
class A
{
public:
A() {p = this;}
static A *GetP() {return p;}
private:
static A *p;
static A instance;
}
template <typename T>
A<T> *A<T>::p = (A<T> *)4534; //just test value to check whether p is initiallized or not.
template <typename T>
A<T> A<T>::instance;
设A<int>::GetP()
。我希望它返回实例的地址,但是它返回(A<int> *)4534
。另外,没有调用构造函数。
我想这意味着p被初始化了,但是instance没有。
但是,如果我这样专门化,
A<int> A<int>::instance
效果很好。为什么会出现这种现象?
14.7.1隐式实例化[temp.inst]:
一般来说,隐式实例化是惰性的;只有那些您调用的方法和您访问的成员才会被实例化。这是一件好事,一方面是为了提高效率,另一方面是因为这意味着,例如,只对某些实例化有效的成员函数仍然可以写在通用模板中;它们只有在被调用时才会被实例化,这可能会使程序格式错误。2 -[…]静态数据成员的初始化(和任何相关的副作用)不会发生,除非静态数据成员本身以某种方式被使用这需要存在静态数据成员的定义。[…]
类模板的隐式实例化不会导致该类的任何静态数据成员被隐式实例化。
可以这样考虑:构建模板化对象需要在编译类型上有一个类型。当你编译这个时,编译器在实例化实例时用什么来代替T ?它不能处理T的所有可能值,所以它不会实例化任何东西。有些编译器甚至会抱怨存在实例。
相关文章:
- C++模板类静态成员初始化
- C :(不重复)积分静态成员初始化(不仅是声明!),导致链接器错误,原因
- 向模板化静态成员初始化添加和不添加'typename'都会出错
- 模板类中的静态成员初始化
- 模板专用化和静态成员初始化
- 静态内联方法无需静态成员初始化
- 静态成员初始化链接错误
- 类内静态成员初始化
- 跨系统的静态成员初始化
- C++类静态成员初始化
- gcc中模板的非延迟静态成员初始化
- Clang++Xcode 4.4非静态成员初始化和移动构造函数
- 为什么静态成员初始化需要"typed again"?
- 即使启用了 C++11,静态成员初始化也不适用于 GCC
- C++静态成员初始化顺序
- 常量静态成员初始化 - 类定义内部与外部类定义
- 如何保证 const 静态成员初始化顺序
- 在单独的库中使用 CRTP 进行静态成员初始化
- 静态成员初始化和可变模板
- 模板化的外部类静态成员初始化