考虑以下代码。
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
withNoDefaultConstructor
或的模板实例化时出错PrivateDefaultConstructor
吗?
更一般地说,SFINAE 是否适用于默认参数值?
谢谢。