когда он встречает набор соответствующих аргументов шаблона. Затем это определение будет генерировать разные экземпляры для каждого набора совпадающих аргументов шаблона (так же, как и определение общего шаблона). Только полная специализация создаст один экземпляр.

я есть этот код

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;

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

Ответы на вопрос(1)

Ваш ответ на вопрос