模板類別中的靜態成員初始化複雜性
C 中的靜態成員初始化是一種廣泛使用的技術,但在處理時可能會變得複雜模板化的類別。在非模板化類別中,可以採用巢狀輔助結構進行初始化,但當封閉類別模板化時,這種方法就不夠了。
考慮以下簡化範例:
<code class="cpp">struct 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 { 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; int main() { std::cout << "A = " << A::getA() << std::endl; // Comment/uncomment lines to observe different behaviors // std::cout << "B = " << B<int>::getB() << std::endl; // [1] // B<int>::getHelper(); // [2] }</code>
預期行為:
當[1] 被取消註解並且[2] 被註解時,我們期望B
實際行為:
差異的原因:
根據ISO/IEC C 2003 標準,在需要其定義的上下文中引用模板成員時,會隱式實例化模板成員。存在。但是,靜態資料成員初始化(以及任何相關的副作用)僅在明確使用靜態資料成員時發生。這意味著,如果範本成員僅在未實例化的範本中或在不需要其完全實例化的其他上下文中引用,則其靜態資料成員將不會被初始化。 在範例中,B解決方案:
此標準禁止明確專用類別模板靜態資料成員的定義進行有序初始化,而其他類別模板靜態資料成員進行無序初始化。為了確保一致的初始化順序,必須使用顯式特化。以上是為什麼模板類別中的靜態成員初始化行為不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!