考虑下面的代码。
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
模板实例化时发生错误吗?更一般而言,SFINEE是否适用于默认参数值?
谢谢。
最佳答案
它应该编译良好,因为在显式指定第二个参数时无需调用默认构造函数(仅调用int的转换构造函数和copy构造函数)。
注意:与SFINAE无关
关于c++ - SFINAE默认参数值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17236473/