2012-09-22 28 views
3

根據此頁面: http://womble.decadent.org.uk/c++/template-faq.html#non-dependent 「非依賴名稱是那些被認爲不依賴於模板參數的名稱,以及模板本身的名稱和在其中聲明的名稱(成員,朋友和本地變量)」C++ 98標準在哪裏指定本地聲明的模板名稱不相關?

這似乎是由一個事實,即下面的代碼被認爲是有效的(由LLVM /科莫)

template<typename T> 
struct Template 
{ 
    typedef int I; 
    typedef Template::I Type; // 'Template' is NOT dependent 
    typedef Template<T>::I Type2; // 'Template<T>' is NOT dependent 
    Template<T>* m; 
    void f() 
    { 
     m->f(); // 'm' is NOT dependent 
    } 
}; 

備份花一些時間閱讀的C++ 98標準後,我找不到在哪裏這個行爲指定。我希望在'temp.nondep'下找到這個提及。

+0

請注意,由於C++ 11現在有一堆關於「名稱指當前實例*如果」涉及這種用法的語言。 –

回答

1

C++ 98標準沒有定義「非依賴」,「非依賴」或「非依賴」名稱(可以在標準文本中找到所有三種形式)的含義。

相反,它選擇定義什麼名稱和類型依賴於14.6 [temp.res]及其子章節中的模板參數。應用簡單的邏輯......不被認爲是依賴的一切都是非依賴的。只有閱讀14.6.3 [temp.nondep]沒有幫助。

+1

重讀14.6 [temp.res]回答我的問題:「在模板定義中可以使用三種名稱: - 模板本身的名稱以及在模板本身內聲明的名稱 - 依賴於模板的名稱-parameter - 在模板定義中可見的範圍名稱。「這意味着該模板的名稱被排除在「取決於模板參數的名稱」集上。 – willj

+0

@willj是的,你確實比我更清楚地回答了你自己的問題。 :) –