我认为以下代码应输出总和sizeof(int)+ sizeof(float)+ sizeof(std :: string),但存储值始终为零。为什么?
struct Base {
static int IncrementID(int x) {
static int id = 0;
storage += x;
return id++;
}
static int storage;
};
int Base::storage = 0;
template<typename T>
struct Object : public Base {
static const int id;
};
template<typename T>
const int Object<T>::id(Base::IncrementID(sizeof(T)));
int main() {
Object<int> a;
Object<float> b;
Object<std::string> c;
std::cout << Base::storage;
}
答案 0 :(得分:1)
请勿以任何可能导致其隐式实例化的方式使用这些静态id
数据成员。这意味着它们不必实例化(也不必进行初始化)。引用C ++标准:
[临时温度]
3除非类模板的成员或成员模板具有 被明确实例化或专门化, 当成员的专业化被隐式实例化时, 在需要成员的上下文中引用专业化 存在的定义;特别是初始化(以及任何 除非发生静态数据成员相关的副作用) 静态数据成员本身的使用方式要求 静态数据成员的定义。
做一些像添加用户定义的构造函数一样简单的事情
Object() {
int i = id;
(void)i;
}
Can be enough来使用它们,并通过像您一样创建对象来强制其实例化。