2 Частичное упорядочение выбирает, какой из двух шаблонов функций является более специализированным, чем другой, путем преобразования каждого шаблона по очереди (см. Следующий абзац) ивыполнение вывода аргумента шаблона с использованием типа функции. Процесс удержания определяет, является ли один из шаблонов более специализированным, чем другой . Если это так, то более специализированный шаблон выбирается в процессе частичного упорядочения.Если оба вывода успешны, частичное упорядочение выбирает более ограниченный шаблон, как описано в правилах в 17.4.4.
17.6.5.2 Частичное упорядочение специализаций шаблона класса [temp.class.order]
1 Для двух частичных специализаций шаблонов классов первый более специализирован, чем второй, если, учитывая следующее переписывание двух шаблонов функций, первый шаблон функции более специализирован, чем второй, в соответствии с правилами упорядочения для шаблонов функций (17.6.6.2): (1.1) - Каждый из двух шаблонов функций имеет те же параметры шаблона и связанные ограничения (17.4.2), что и соответствующая частичная специализация.
(1.2) - Каждый шаблон функции имеет одинпараметр функции, тип которой является специализацией шаблона класса, где аргументы шаблона - это соответствующие параметры шаблона из шаблона функции для каждого аргумента шаблона в списке аргументов шаблона простого идентификатора шаблона частичного объекта.cialization .
2 [Пример:
template<int I, int J, class T> class X { };
template<int I, int J> class X<I, J, int> { }; // #1
template<int I> class X<I, I, int> { }; // #2
template<int I0, int J0> void f(X<I0, J0, int>); // A
template<int I0> void f(X<I0, I0, int>); // B
template <auto v> class Y { };
template <auto* p> class Y<p> { }; // #3
template <auto** pp> class Y<pp> { }; // #4
template <auto* p0> void g(Y<p0>); // C
template <auto** pp0> void g(Y<pp0>); // D
Согласно правилам упорядочения для шаблонов функций, шаблон функции B является более специализированным, чем шаблон функции A и шаблон функции Dявляется более специализированным, чем шаблон функции C. Следовательно, частичная специализация # 2 является более специализированной, чем частичная специализация # 1, а частичная специализация # 4 является более специализированной, чем частичная специализация # 3.- конец примера]
[Пример:
template<typename T> concept C = requires (T t) { t.f(); };
template<typename T> concept D = C<T> && requires (T t) { t.f(); };
template<typename T> class S { };
template<C T> class S<T> { }; // #1
template<D T> class S<T> { }; // #2
template<C T> void f(S<T>); // A
template<D T> void f(S<T>); // B
Частичная специализация # 2 более специализирована, чем # 1, потому что B более специализирован, чем A .- конец примера]