![](/img/trans.png)
[英]why the c++ constructor was not called when it appear as the static member variable?
[英]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.