2017-08-28 105 views
1

當我遇到SFINAE的示例代碼時,我正在學習一些C++習慣用法,我對代碼感到困惑。沒有定義的類的功能不會導致錯誤

說明:is_ptr()沒有定義。

  1. 我自己編譯代碼,沒有關於函數定義不足的編譯器錯誤,爲什麼?

  2. sizeof()被用在其中一個調用上,它顯然是在函數的返回值上執行的,但是再次沒有定義。這怎麼可能?

    template <typename T> 
    struct is_pointer 
    { 
        template <typename U> 
         static char is_ptr(U*); 
    
        template <typename X, typename Y> 
         static char is_ptr(X Y::*); 
    
        template <typename U> 
         static char is_ptr(U (*)()); 
    
        static double is_ptr(...); 
    
        static T t; 
        enum {value = sizeof(is_ptr(t)) == sizeof(char)}; 
    }; 
    
+3

發佈代碼**不是**圖片,而是代碼格式文本! –

+0

你有沒有在某個地方的模板類的instatiation? – user0042

+0

我現在在移動設備上,因此我無法粘貼代碼。 我唯一使用的是is_pointer ::主函數中的值 – user3414321

回答

4

sizeof就是所謂的未評估的背景。在它內部,表達式只需要很好地形成,沒有任何事情會被執行。所以一個只聲明的函數可以在裏面使用而不需要實際的定義。

這是因爲定義不需要確定類型信息。在這種情況下,由ADL選擇的過載是有問題的類型信息。它的返回類型也可以從聲明中單獨獲得。

+0

謝謝,這讓我撓了腦袋,我知道模板函數只是在被調用時才創建的,所以我認爲它被稱爲值。 – user3414321

+1

@ user3414321 - 也是這樣,但在這種情況下,它與正在發生的事情正交。如果您試圖實際執行模板超載,您會得到您期望的錯誤。 – StoryTeller

相關問題