簡體   English   中英

沒有調用C ++模板化靜態成員構造函數

[英]C++ templated static member constructor not being called

我有一個具有靜態成員實例的類的兩個測試用例。 第一個使用非模板樣本,而第二個則依賴於通用對象類型。

難題很簡單 :靜態成員的構造函數在主函數之前(應該如此)被調用,但僅針對特定的對象類型。 通用類型不會表現出相同的行為。 實際上,構造函數根本沒有編譯。 似乎編譯器決定完全忽略它,以作為(不是完全合理的)優化手段。

我想知道正在發生什么,可以做什么以使其以最優雅的方式工作。 我認為最明顯的答案是:在代碼中的某處使用該靜態成員。 我不想這樣做,因為除了在其構造函數中執行一些“工作”之外,特定類型的情況在不使用該靜態成員的情況下也可以工作。

代碼示例:

//////////////////////////////////////////////
// Specific case
//////////////////////////////////////////////
class CPassive
{
public:
    CPassive()
    {
        printf(" passively called ");
    }
};

class CActive
{
private:
    static CPassive ms_passive;
};
CPassive CActive::ms_passive;
///////////////////////////////////////////////////////////
// GENERIC TYPES
///////////////////////////////////////////////////////////
class CSample
{
public:
    CSample()
    {
        printf("sample ");
    }
};

template <typename T>
class CGenericPassive
{
public:
    CGenericPassive()
    {
        T sample;
        printf(" generic passive .. ");
    }
private:
};

template <typename T>
class CGenericActive
{
private:
    static CGenericPassive<T> ms_passive;
};
template<typename T>
CGenericPassive<T> CGenericActive<T>::ms_passive;

int main(int argc, char** argv)
{
    CActive activeExample;// instantiates the static member
    CGenericActive<CSample> activeExample; // obliterates the static from the class def.
}

要實例化的每個類模板的每個(非虛擬)成員都需要直接或間接從非模板代碼中引用。 實例化類本身是不夠的。

這受標准14.7.1 / 2的約束:

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

在您的情況下,引用CGenericActive構造函數的成員就足夠了(顯然,您需要編寫此構造函數),如下所示:

CGenericActive()
 {
   // just reference it so it gets instantiated
   (void)ms_passive;
 }

完整的示例

暫無
暫無

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

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