Компиляторы верны.#1
более специализирован, чем #2
.
Правило для пакетов параметров шаблона частичного упорядочения указано в [temp.deduct.partial] / 8 :
Используя результирующие типы P
и A
, затем производится вычет, как описано в [temp.deduct.type].Если P
является пакетом параметров функции, тип A
каждого оставшегося типа параметра шаблона аргумента сравнивается с типом P
идентификатора объявления 1017 * пакета параметров функции.Каждое сравнение выводит аргументы шаблона для последующих позиций в пакетах параметров шаблона, расширенных пакетом параметров функции.Аналогично, если A
был преобразован из пакета параметров функции, он сравнивается с каждым оставшимся типом параметра в шаблоне параметров.Если для данного типа выведение выполняется успешно, считается, что тип из шаблона аргумента, по крайней мере, такой же специализированный, как и тип из шаблона параметра.
Когда шаблон параметра равен #1
и аргументшаблон #2
, идентификатор объявления Args
(который является типом) из #2
сравнивается с каждым из оставшихся параметров в #1
(его нет).Следовательно, #2
является, по крайней мере, таким же специализированным, как #1
.
Когда шаблон параметра равен #2
, а шаблон аргумента #1
, идентификатор объявления Args
(который является типом) из #2
сравнивается с каждым из оставшихся параметров в #1
(его нет).Следовательно, #1
по крайней мере так же специализирован, как и #2
.
Кажется двусмысленным, верно?Теперь у нас есть прерыватель связи, [temp.deduct.partial] / 11 :
Если, после рассмотрения вышеизложенного, шаблон функции F
является по меньшей мере таким же специализированным, какшаблон функции G
и наоборот, и если G
имеет пакет конечных параметров, для которого F
не имеет соответствующего параметра, и если F
не имеет пакет конечных параметров, тогда F
более специализированный, чем G
.
Очевидно, #1
более специализирован, чем #2
.