PrivateDefaultConstructor

PrivateDefaultConstructor

考虑下面的代码。

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上很好地编译,但是要说的标准是什么呢?我应该在使用SNoDefaultConstructorPrivateDefaultConstructor模板实例化时发生错误吗?

更一般而言,SFINEE是否适用于默认参数值?

谢谢。

最佳答案

它应该编译良好,因为在显式指定第二个参数时无需调用默认构造函数(仅调用int的转换构造函数和copy构造函数)。

注意:与SFINAE无关

关于c++ - SFINAE默认参数值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17236473/

10-13 09:38