我有这个代码
template<int N, bool C = true>
struct A;
template<int N>
struct A<N, !(N % 5)> {
/* ... */
};
// should work
A<25> a;
也就是说,对于N
能被 整除的数字,5
编译器应该使用偏特化。但是编译器不会接受这种部分特化,因为标准要求它拒绝这样的代码,其中部分特化的非类型参数引用参数而不是简单的参数(例如,A<N, N>
将是有效的)。但是这样做的原因是什么?
请注意,我可以简单地将我的代码更改为更冗长的示例,并且它是有效的
template<bool> struct wrap;
template<int N, typename = wrap<true> >
struct A;
template<int N>
struct A<N, wrap<!(N % 5)> > {
/* ... */
};
// should work
A<25> a;
这很好,因为它不再是非类型参数。但是规范禁止更直接的部分专业化的原因是什么?