Два template-ids относятся к одному и тому же классу, функции или переменной, если
их template-names, operator-function-idsили literal-operator-ids ссылаются на тот же шаблон и
их соответствующий тип template-arguments - того же типа и
соответствующие им не типовые аргументы шаблона целочисленного или перечислимого типа имеют идентичные значения и
соответствующий им не тип template-arguments указателя типа относится к одному и тому же объекту или функции или является как значением нулевого указателя, так и
их соответствующий не тип template-arguments типа указатель на член относится к одному и тому же члену класса или является как значением указателя нулевого члена, так и
соответствующие template-arguments им ссылочные типы, не являющиеся типами, относятся к одному и тому же объекту или функции и
их соответствующий шаблон template-arguments относится к одному и тому же шаблону.
[ Example:
template<class E, int size> class buffer { /* ... */ };
buffer<char,2*512> x;
buffer<char,1024> y;
объявляет x и y быть одного типа, и
template<class T, void(*err_fct)()> class list { /* ... */ };
list<int,&error_handler1> x1;
list<int,&error_handler2> x2;
list<int,&error_handler2> x3;
list<char,&error_handler2> x4;
объявляет x2 и x3 быть одного типа. Их тип отличается от типов x1 и x4.
template<class T> struct X { }; template<class> struct Y { }; template<class T> using Z = Y<T>; X<Y<int> > y; X<Z<int> > z;
объявляет y и z быть одного типа. ] — end example
Если выражение e равно type-dependent, decltype(e) обозначает уникальный зависимый тип. Два таких decltype-specifiers относятся к одному и тому же типу, только если expressions они эквивалентны ([temp.over.link]). [ Note: Однако такой тип может иметь псевдоним, например, a typedef-name. ] — end note