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 可以很好地编译,但是有什么标准来说明它呢?我应该期望SwithNoDefaultConstructor或的模板实例化时出错PrivateDefaultConstructor吗?

更一般地说,SFINAE 是否适用于默认参数值?

谢谢。

4

1 回答 1

2

它应该编译得很好,因为当显式指定第二个参数时不需要调用默认构造函数(仅调用来自 int 的转换构造函数和复制构造函数)。

注:与 SFINAE 无关

于 2013-06-21T13:38:01.763 回答