次のコードを検討してください。
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;
S<NoDefaultConstructor> sndc(1);
S<PrivateDefaultConstructor> spdc;
S<PrivateDefaultConstructor> spdc(1);
しかし、次の場合はどうでしょうか。
S<NoDefaultConstructor> sndc(1, 1);
S<PrivateDefaultConstructor> spdc(1, 1);
これは GCC 4.4.1 で問題なくコンパイルされますが、それについて何と言う標準がありますか? S
または を使用したテンプレートのインスタンス化でエラーが発生することを予期する必要がありますNoDefaultConstructor
かPrivateDefaultConstructor
?
より一般的には、SFINAE はデフォルトのパラメーター値に適用されますか?
ありがとう。