Proposed resolution (September, 2012):
Add the following as a new paragraph following 13.7.8 [temp.alias] paragraph 2:
When the type-id in the declaration of alias template (call it A) consists of a simple-template-id in which the template-argument-list consists of a list of identifiers naming each template-parameter of A exactly once in the same order in which they appear in A's template-parameter-list, the alias template is equivalent to the template named in the simple-template-id (call it T) if A and T have the same number of template-parameters. [Footnote: This rule is transitive: if an alias template A is equivalent to another alias template B that is equivalent to a class template C, then A is also equivalent to C, and A and B are also equivalent to each other. —end footnote] [Example:
template<typename T, U = T> struct A; template<typename V, typename W> using B = A<V, W>; // equivalent to A template<typename V, typename W> using C = A<V>; // not equivalent to A: // not all parameters used template<typename V> using D = A<V>; // not equivalent to A: // different number of parameters template<typename V, typename W> using E = A<W, V>; // not equivalent to A: // template-arguments in wrong order template<typename V, typename W = int> using F = A<V, W>; // equivalent to A: // default arguments not considered template<typename V, typename W> using G = A<V, W>; // equivalent to A and B template<typename V, typename W> using H = E<V, W>; // equivalent to E template<typename V, typename W> using I = A<V, typename W::type>; // not equivalent to A: // argument not identifier—end example]
Change 13.6 [temp.type] paragraph 1 as follows:
Two template-ids refer to the same class or function if
...
their corresponding template template-arguments refer to the same or equivalent (13.7.8 [temp.alias]) templates.
[Example:
...declares x2 and x3 to be of the same type. Their type differs from the types of x1 and x4.
template<class Ttemplate<class> class TT> struct X { }; template<class> struct Y { }; template<class T> using Z = Y<T>; X<Y<int>Y> y; X<Z<int>Z> z;declares y and z to be of the same type. —end example]