2013-05-22 136 views

回答

9

很多早期的C++編譯器都實例化了所有的成員函數,無論你是否曾經調用它們。

考慮例如std::list,其具有sort成員函數。使用當前運行正常的編譯器,可以通過不支持比較的類型實例化list。如果您嘗試使用list::sort,則會失敗,因爲您不支持比較。只要你不打電話給sort這個清單,儘管如此,因爲list<T>::sort不會被實例化,除非你打電話給它。

但是,使用那些功能不佳的編譯器,嘗試創建list<T>意味着即使您從未使用過list<T>::sort也會被實例化。 list::sort的存在意味着您需要爲T實施<,只是爲了創建list<T>,即使您根本沒有在該類型的列表上實際使用sort

0

一類的方法也是成員。類模板方法在被實例化的類調用時被實例化。所以有可能這些成員方法從未被實例化。

1

該標準清楚地表明(非模板和模板)成員方法實例只有在使用時纔會發生。

從C++標準的摘錄(N3690 - 14.7.1(2)隱式實例)

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

相關問題