N4527 14.5.5.1 [temp.class.spec.match]
2 Частичная специализация соответствует данному фактическому списку аргументов шаблона, если аргументы шаблона частичной специализации могут быть выведены из фактического списка аргументов шаблона.
template<class T1, class T2, int I> class A { }; // #1 template<class T, int I> class A<T, T*, I> { }; // #2 template<class T1, class T2, int I> class A<T1*, T2, I> { }; // #3 template<class T> class A<int, T*, 5> { }; // #4 template<class T1, class T2, int I> class A<T1, T2*, I> { }; // #5 A<int, int, 1> a1; // uses #1 A<int, int*, 1> a2; // uses #2, T is int, I is 1 A<int, char*, 5> a3; // uses #4, T is char A<int, char*, 1> a4; // uses #5, T1 is int, T2 is char, I is 1 A<int*, int*, 2> a5; // ambiguous: matches #3 and #5
3 Аргумент шаблона непигового типа также можно вывести из значения фактического аргумента шаблона параметра непигового типа первичного шаблона. [Пример: объявление
a2
выше. -end пример]4 В имени типа, которое относится к специализации шаблона класса (например,
A<int, int, 1>
), список аргументов должен сопоставьте список параметров шаблона основного шаблона. Шаблонными аргументами специализации являются выводится из аргументов первичного шаблона.
В правиле 3 пример показывает, что I
выводится из третьего фактического аргумента шаблона 1
, это то, что говорит правило2. Так как второе предложение правила4, я думаю, что он повторяет то, что говорит правило2.
Каковы различия между ними (правило2, правило3 и правило4)?
Другими словами, у нас уже есть правило 2, каковы намерения (значение) правила 3 и второе предложение правила4, почему они здесь?