частичной специализации шаблонов с переменным количеством аргументов

рассмотрим следующий шаблон класса " x " и его частичной специализации.

template <class ...types>struct x {};               // #1template <class t1>struct x<t1> {};           // #2template <class t1, class ...types>struct x<t1, types...> {}; // #3x<int> x;                  // #2 or #3 ?

я подозреваю, что х<инт> неоднозначен. это потому, что:

очевидно, что как #2 и #3 являются более специализированными, чем #1, #2 и #3 сейчас по сравнению. по данным 14.5.5.2, давайте рассмотрим, какие из следующих #2 и #3-это более специализированных.

template <class t1>void f(x<t1>);             // #2'template <class t1, class ...types>void f(x<t1, types...>);   // #3'

по данным 14.8.2.4, первый шаг это шаблон вычета, используя аргумент #2' в качестве аргумента шаблона и № 3' в качестве параметра шаблона. учитывая только тип аргумента х<а1>, выведенная т1 а1 и типы пуст.

a = x<a1>, p = x<t1, types...>  =>  t1 = a1, types = {}

второй шаг делается с помощью #3' в качестве аргумента шаблона и #2' в качестве параметра шаблона. учитывая только тип аргумента х<а1, то args...>, согласно 14.8.2.5/9 (обратите внимание, что этот пункт был недавно пересмотрен n3281), аргументы просто игнорируются, выведенные т1 а1 и дедукции аргумент удастся.

a = x<a1, args...>, p = x<t1>  =>  t1 = a1 (args is ignored)

наконец, двунаправленный вычеты аргумент удалось. так что #2-это просто как специализированный #3. в заключение, х<инт> является неоднозначным.

на мой вопрос: "это моя интерпретация правильная?"

если эта интерпретация верна, определение 'с std::common_type в 20.9.7.6/3 нецелесообразно.

template <class ...t>struct common_type;            // #1template <class t>struct common_type<t>          // #2{    typedef t type;};template <class t, class u>struct common_type<t, u>       // #3{    typedef        decltype(true ? declval<t>() : declval<u>())    type;};template <class t, class u, class ...v>struct common_type<t, u, v...> // #4{    typedef typename        common_type<typename common_type<t, u>::type, v...>::type    type;};

при использовании common_type<а, b> это, #3 и #4 неоднозначны.

примечание: в первом примере, 4.7.0 ссз (моментальный снимок) и clang 3.0 выберите #2. однако, эти компиляторы настолько ненадежны, что они не следуют другие изменения по n3281.