У меня есть этот код
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;
Это прекрасно, потому что это не параметр не-типа больше. Но по какой причине спецификация запрещает более прямую частичную специализацию?