Почему для частичной специализации в аргументе, не являющемся типом, запрещено использовать вложенные параметры шаблона

У меня есть этот код

template<int N, bool C = true>
struct A;

template<int N>
struct A<N, !(N % 5)> {
  /* ... */
};

// should work
A<25> a;

То есть для чисел N , которые делятся на 5 , компилятор должен использовать частичная специализация. Но компилятор не принимает эту частичную специализацию, потому что Стандарт требует, чтобы он отклонял такой код, в котором аргумент, не являющийся типом частичной специализации, ссылается на параметр, а не является просто параметром (например, A будет действительно). Но в чем причина этого?

Обратите внимание, что я могу просто изменить свой код на более многословный пример, и он действителен

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;

Это нормально, потому что это больше не параметр, не являющийся типом. Но по какой причине спецификация запрещает более простую частичную специализацию?

36
задан Johannes Schaub - litb 12 May 2011 в 13:23
поделиться