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