巢狀範本函數中的C 靜態成員初始化
靜態成員初始化可以透過巢狀輔助結構來實現,尤其是在非模板化類別中。但是,當封閉類別由模板參數化時,這種方法可能會遇到問題。具體來說,如果在主代碼中未存取輔助對象,則嵌套初始化類別可能不會實例化。
考慮以下簡化範例,此範例說明了向量的初始化:
<code class="cpp">struct A { struct InitHelper { InitHelper() { A::mA = "Hello, I'm A."; } }; static std::string mA; static InitHelper mInit; static const std::string& getA(){ return mA; } }; std::string A::mA; A::InitHelper A::mInit; template<class T> struct B { struct InitHelper { InitHelper() { B<T>::mB = "Hello, I'm B."; } }; static std::string mB; static InitHelper mInit; static const std::string& getB() { return mB; } static InitHelper& getHelper(){ return mInit; } }; template<class T> std::string B<T>::mB; template<class T> typename B<T>::InitHelper B<T>::mInit;</code>
使用g 4.4.1 編譯時,會出現以下幾個觀察結果:
此行為源自於編譯器對 ISO/IEC C 2003 標準 (14.7.1) 的解釋。標準規定:
「除非類別範本或成員範本的成員已被明確實例化或明確特化,否則當在類別範本中引用特化時,會隱式實例化此成員的特化。 p>
這解釋了為什麼在給定的範例中,靜態成員在透過getB() 或getHelper() 方法存取之前不會被初始化。在主函數中明確實例化類別模板或成員模板將強制它們在此時初始化。然而,對於直接存取不可行的場景,該標準沒有指定一種優雅的解決方法來初始化巢狀模板函數中的靜態成員。
以上是如何在 C 中的巢狀模板函數中初始化靜態成員?的詳細內容。更多資訊請關注PHP中文網其他相關文章!