3

次のコードを検討してください。

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または を使用したテンプレートのインスタンス化でエラーが発生することを予期する必要がありますNoDefaultConstructorPrivateDefaultConstructor?

より一般的には、SFINAE はデフォルトのパラメーター値に適用されますか?

ありがとう。

4

1 に答える 1