2010-03-17 41 views
7

指的是昨天的帖子, 今天早上醒來了。爲什麼這實際上工作?只要函數test是關於這個函數沒有主體,那麼它如何執行任何操作?我想知道爲什麼以及如何工作?我真的很想看到你的答案。爲什麼這個工程(模板,SFINAE)。 C++

template<typename T> 
class IsClassT { 
    private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(int C::*); //NO BODY HERE 
    template<typename C> static Two test(…); //NOR HERE 
    public: 
    enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One) }; 
    enum { No = !Yes }; 
}; 

在此先感謝幫助理解這一非常有趣的現象。

+0

對於Standardese,見'3.2/2'和'3.2/3'(包括對 「使用」 的定義和使用後果的」 「某事)。 –

回答

6

我想你是指的是枚舉? IsClassT<T>::test<T>(0)? sizeof並沒有真正評估它的參數。這就是爲什麼像下面的代碼是合法的,即使你可能指望它拯救你:

int* p = 0; 
int sizeof_int = sizeof(*p); //oops, p is 0 :(
+0

我真正感興趣的是爲什麼即使測試沒有身體我沒有得到這個錯誤? –

+7

因爲返回類型在編譯時在沒有body的情況下是已知的。它只是一個'char'或'char [2]'。這是編譯器的全部需求,並且受到標準的制裁。很明顯,'sizeof'適用於函數的返回值(而不是函數的代碼大小),並且計算出您只需要知道類型,而不是具有該類型的實際對象。 – Ari

8
  1. 因爲test - 功能聲明存在不能獲得編譯器錯誤。

  2. 您無法獲取鏈接器錯誤,因爲您的不會調用test功能。

C++斯坦達特ISO/IEC 14882:2003(E)

5.3.3的sizeof

sizeof運算符產生的字節在其操作數的 對象表示的數量。 該操作數是表達式 ,其中未被評估或 括號內的類型標識。 sizeof運算 經營者不得......

...