¿Por qué no se permite la especialización parcial en un argumento que no sea de tipo para usar parámetros de plantilla anidados?

Tengo este código

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

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

// should work
A<25> a;

Es decir, para númerosN que son divisibles por5, el compilador debe usar la especialización parcial. Pero el compilador no aceptará esa especialización parcial, porque el Estándar requiere que rechace dicho código donde un argumento sin tipo de una especialización parcial hace referencia a un parámetro y no es simplemente un parámetro (como,A<N, N> sería válido). ¿Pero cuál es la razón para hacerlo?

enga en cuenta que simplemente puedo cambiar mi código a un ejemplo más prolijo y es válido

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;

Esto está bien porque ya no es un parámetro que no es de tipo. ¿Pero cuál es la razón por la cual la especificación prohíbe la especialización parcial más direct

Respuestas a la pregunta(2)

Su respuesta a la pregunta