的Wikipedia article這樣說:類模板可以在沒有成員的情況下實例化嗎?
實例化一個類模板不會導致其成員的定義被實例化。
我無法想象C++中的任何類正在被實例化,無論是否來自模板,哪些類成員沒有被實例化?
的Wikipedia article這樣說:類模板可以在沒有成員的情況下實例化嗎?
實例化一個類模板不會導致其成員的定義被實例化。
我無法想象C++中的任何類正在被實例化,無論是否來自模板,哪些類成員沒有被實例化?
很多早期的C++編譯器都實例化了所有的成員函數,無論你是否曾經調用它們。
考慮例如std::list
,其具有sort
成員函數。使用當前運行正常的編譯器,可以通過不支持比較的類型實例化list
。如果您嘗試使用list::sort
,則會失敗,因爲您不支持比較。只要你不打電話給sort
這個清單,儘管如此,因爲list<T>::sort
不會被實例化,除非你打電話給它。
但是,使用那些功能不佳的編譯器,嘗試創建list<T>
意味着即使您從未使用過list<T>::sort
也會被實例化。 list::sort
的存在意味着您需要爲T
實施<
,只是爲了創建list<T>
,即使您根本沒有在該類型的列表上實際使用sort
。
一類的方法也是成員。類模板方法在被實例化的類調用時被實例化。所以有可能這些成員方法從未被實例化。
該標準清楚地表明(非模板和模板)成員方法實例只有在使用時纔會發生。
從C++標準的摘錄(N3690 - 14.7.1(2)隱式實例)
2除非類模板或構件模板的成員已被顯式實例或明確專門中,該部件的專業化被隱式實例化,當需要成員定義存在的上下文中引用專業化時;特別是靜態數據成員的初始化(以及任何相關的副作用)不會發生,除非靜態數據成員本身以需要靜態數據成員定義存在的方式使用。
這適用於成員函數。但我可以想象,如果你調用類模板的靜態方法,數據成員也不需要實例化。 – juanchopanza