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,但有什麼標準可以說呢?我是否應該在模板實例化S
與NoDefaultConstructor
或PrivateDefaultConstructor
期望出現錯誤?
更一般地說,SFINAE是否適用於默認參數值?
謝謝。
拷貝構造函數和來自'int'的轉換構造函數。 – jrok
@jrok:謝謝,編輯 – user396672
謝謝。那麼如果'S'構造函數不是使用'Metadata()'作爲參數'm'的默認值,而是使用'typename Metadata :: type()'這樣的構造函數呢?它是否應該在立即執行時進行編譯,比如說'float',如果爲這個參數傳遞一個值? –