簡體   English   中英

模板,繼承,靜態成員增量

[英]Template, Inheritance, static member incrementation

我認為以下代碼應輸出sum 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;
}

請勿以任何可能導致其隱式實例化的方式使用這些靜態id數據成員。 這意味着它們不必實例化(也不必進行初始化)。 引用C ++標准:

[temp.inst]

3除非已經明確實例化了類模板或成員模板的成員或對其進行了專門化,否則當在需要存在成員定義的上下文中引用專門化時,將隱式實例化成員的專門化; 尤其是,除非以需要靜態數據成員定義存在的方式使用靜態數據成員本身,否則不會發生靜態數據成員的初始化(以及任何相關的副作用)。

做一些像添加用戶定義的構造函數一樣簡單的事情

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

可以充分使用它們,並通過像創建對象那樣強制實例化它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM