2013-06-21 162 views
2

請考慮以下代碼。SFINAE默認參數值

template <typename Metadata> 
struct S { 
     double data; 
     Metadata metadata; 
     explicit S(double d = 0., Metadata const & m = Metadata()) : 
       data(d), metadata(m) 
     {} 
}; 

struct NoDefaultConstructor { 
     NoDefaultConstructor(int) {} 
}; 

struct PrivateDefaultConstructor { 
     PrivateDefaultConstructor(int) {} 
private: 
     PrivateDefaultConstructor() {} 
}; 

下編譯沒有問題:

S<float> sf; 

正如預期的那樣,下面的代碼示例無法編譯:

S<NoDefaultConstructor> sndc(1, 1); 
S<PrivateDefaultConstructor> spdc(1, 1); 

S<NoDefaultConstructor> sndc; 
S<NoDefaultConstructor> sndc(1); 
S<PrivateDefaultConstructor> spdc; 
S<PrivateDefaultConstructor> spdc(1); 
有關以下

但什麼

它編譯fi ne與GCC 4.4.1,但有什麼標準可以說呢?我是否應該在模板實例化SNoDefaultConstructorPrivateDefaultConstructor期望出現錯誤?

更一般地說,SFINAE是否適用於默認參數值?

謝謝。

回答

1

它應該很好地編譯,因爲當明確指定第二個參數(只有int和copy構造函數的轉換構造函數被調用)時,不需要調用默認構造函數。

注意:它與SFINAE無關

+0

拷貝構造函數和來自'int'的轉換構造函數。 – jrok

+0

@jrok:謝謝,編輯 – user396672

+0

謝謝。那麼如果'S'構造函數不是使用'Metadata()'作爲參數'm'的默認值,而是使用'typename Metadata :: type()'這樣的構造函數呢?它是否應該在立即執行時進行編譯,比如說'float',如果爲這個參數傳遞一個值? –