2016-01-19 116 views
2

因此,讓我們一例子:當一個類模板被實例化時,成員模板聲明是否也被實例化?

template<typename T> struct foo 
{ 
    template<typename X> void bar(void (T::*)()) {} 
    template<typename X> void bar(X*) {} 
    template<typename X> void bar(T**) {} 
}; 

int main() { foo<int> p; } 

請問上述class foo<int>實例化成員模板聲明bar即使成員本身就是模板的實例?任何標準的參考將非常感謝。

+1

你問,如果無限'FOO ::酒吧'被實例化?答案是不。 – Jarod42

+0

@ Jarod42不,只是成員函數模板'bar'的聲明 –

+0

發佈代碼不能編譯 – jpo38

回答

1

答案是肯定的。

從C++ 11標準

引文,[temp.inst] [14.7.1]:

  1. ...
    類模板專業化的隱式實例導致的所述隱式實例 聲明,但不包括類成員函數,成員類,成員範圍成員枚舉,靜態數據成員和成員模板的定義,默認參數或異常規範;它會導致unspecified成員枚舉和成員匿名聯合的定義的隱式實例化。

第二部分有大約被實例化什麼時候該成員模板定義一些更多的信息。 (它一般發生隱式,當它們用於:)

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