Параметры шаблона шаблона: какое правило применяется в следующем примере

Предположим следующий пример

using namespace std;
template <template <typename> class>
struct X 
{
   X() 
   { 
      std::cout << "1"; 
   }
};

template <typename>
struct Y {};

template <typename T>
using Z = Y<T>;

 template <>
 struct X<Y> 
 {
   X() 
   { 
      std::cout << "2"; 
    }
 };

 int main() 
 {
   X<Y> x1;
   X<Z> x2;
 }

Выражение X<Y> x1 ясно, что используется специализация, которая печатает "2"

Второй странный. При анализе X<Z> преобразуется в X< Y < T > >. Я ожидаю напечатать «1». Но при запуске кода это печатает «2». Какое правило применяется во втором?


person getsoubl    schedule 22.08.2018    source источник
comment
Если бы он был переведен в X< Y < T > >, вы получили бы ошибку, потому что T не определено (и еще одну ошибку, потому что Y<T> не является шаблоном (как того требует X), это класс).   -  person melpomene    schedule 22.08.2018


Ответы (1)


Второй странный. При анализе X<Z> преобразуется в X< Y < T > >. Я ожидаю напечатать «1». Но при запуске кода это печатает «2».

No.

У вас есть, что Z<T> определяется как Y<T>, поэтому Y и Z это одно и то же.

И неправда, что X<Z> переводится в X<Y<T>>X<Y<T>> не может совпадать, потому что Y<T> - это тип, где X принимает только аргументы шаблона-шаблона).

person max66    schedule 22.08.2018