模板,继承,静态成员增量

时间:2019-07-06 12:14:36

标签: c++

我认为以下代码应输出总和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;
}

1 个答案:

答案 0 :(得分:1)

请勿以任何可能导致其隐式实例化的方式使用这些静态id数据成员。这意味着它们不必实例化(也不必进行初始化)。引用C ++标准:

  

[临时温度]

     

3除非类模板的成员或成员模板具有   被明确实例化或专门化,   当成员的专业化被隐式实例化时,   在需要成员的上下文中引用专业化   存在的定义;特别是初始化(以及任何   除非发生静态数据成员相关的副作用)   静态数据成员本身的使用方式要求   静态数据成员的定义。

做一些像添加用户定义的构造函数一样简单的事情

Object() {
    int i = id;
    (void)i;
}

Can be enough来使用它们,并通过像您一样创建对象来强制其实例化。