В параграфе 8 [temp.class.spec] стандарт гласит, что
В списке аргументов частичной специализации шаблона класса применяются следующие ограничения:
- Частично специализированный неВыражение аргумента типа не должно включать параметр шаблона частичной специализации, кроме случаев, когда выражение аргумента является простым идентификатором.[ Пример:
template <int I, int J> struct A {};
template <int I> struct A<I+5, I*2> {}; // error<br>
template <int I, int J> struct B {};
template <int I> struct B<I, I> {}; // OK
-
конец примера ]
Цель правила состоит в том, чтобы запретить частичные специализации на основе нетривиальных выражений, подобных тем, что впример, и sizeof...(Indices)
- это , а не простой идентификатор, поэтому, возможно, Clang и ICC правы, чтобы отклонить его.Я не уверен, какой компилятор прав, если честно.Я предлагаю сообщить об ошибке одному из компиляторов, и если они скажут, что их реализация верна, сообщите об этом другим для интерпретации по-другому!