17 Templates [temp]

17.4 Type equivalence [temp.type]

Два 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