2009-11-26 26 views
4

我剛剛發現,當它涉及到模板的代碼用g ++ 3.4.2編譯,除非m的作用()不叫:這段代碼合法的C++

template <typename T> 
class C 
{ 
    T e; 

    public: 
     C(): e(0) {}; 

    void m() 
    { 
     e = 0; 
    }; 
}; 

現在,人們可以創建和使用實例

C<const int> c; 

直到c.m()不被調用有沒有編譯錯誤,但這是合法的嗎?

回答

11

是的,這是合法的。模板規範是,直到一個方法被實例化,它不存在,因此編譯器不檢查。下面是從the spec的相關位:

14.7.1 - 隱式實例

-9-的實現不應隱含實例化一個函數模板 ,成員模板,一個 非虛成員函數,成員 類或不需要 實例化一個 類模板的靜態數據成員。

+2

廣義正確的,但更準確地說,它應該談論的方法被實例化,而不是調用。除了調用它,帶一個成員指針也會這樣做;並且如果一個方法是虛擬的,它是實現定義的,無論實例化是否延遲。 – 2009-11-26 23:05:02

+1

至少依賴於模板類型的任何內容。有一些與非依賴性錯誤混淆。例如,VC++將在方法,只要你不調用它接受甚至是完整的胡言亂語(這裏'無感;'),但其他的編譯器不會接受,即使你不要實例在所有的模板(其可能更正確)。 – UncleBens 2009-11-26 23:09:15

+0

任何人都知道標準的意圖是什麼?至少在我的應用程序的當前級別上,我不需要例如專門爲const版本的模板編寫代碼(爲了清晰起見,我可能將來會這樣做)。但是這是一個例子嗎? – doc 2009-11-27 00:50:14