Это недопустимая частичная специализация (хотя ошибка может быть лучше). Предложение, с которым мы не в строке, выглядит следующим образом:
[temp.class.spec]
8 в списке аргументовчастичной специализации шаблона класса применяются следующие ограничения:
- Специализация должна быть более специализированной, чем основной шаблон.
"Специализация не болееспециализированный !?»Я полагаю, вы думаете. Но это действительно так. Правила определения того, что является «более специализированным», описаны в [temp.class.order] . Суть в том, что мы должны рассмотреть две гипотетические перегрузки шаблонов функций:
template <int I>
struct A { /* ... */ };
template<int I>
void foo(A<I>); //1
template<int I>
void foo(A<I + 5>); //2
Затем мы выполняем разрешение перегрузки и частичное упорядочение шаблонов функций. Если победит # 2, это более специализировано, и ваша декларация законна. Если это не победит, объявление недействительно. Частичное упорядочение выполняется путем составления некоторых аргументов и вычитания аргументов шаблона одного шаблона относительно другого. Итак, предположим, что мы начнем со сравнения первого со вторым (я переименую их для простоты, но они все еще перегружены):
void foo1(A<0>); -> void foo2(A<I + 5>);
Успешен ли здесь вывод аргумента? Это не так. I + 5
- это не выводимый контекст:
[temp.deduct.type]
Неведуемые контексты:
5.3 - нетипизированный аргумент шаблона или граница массива, в которой подвыражение ссылается на параметр шаблона.
I
ссылается на параметр шаблона, поэтому I + 5
это не выводимый контекст. Поэтому вывод аргументов шаблона не выполняется в этом направлении.
Давайте попробуем другое направление. Снова мы выдвигаем аргумент
void foo2(A<1 + 5>); = void foo2(A<6>); -> void foo1(A<I>);
Удержание, очевидно, здесь успешно. Таким образом, согласно правилам частичного упорядочения шаблона функции, foo1
более специализирован, чем foo2
. Это означает, что наша основная специализация действительно более специализирована, чем наша «частичная специализация», что делает частичную специализацию плохо сформированной.