Псевдоним шаблона C ++ 11 в качестве аргумента шаблона шаблона приводит к другому типу?

Мы наблюдали странное поведение при компиляции следующего исходного кода:

template<template<class> class TT> struct X { };
template<class> struct Y { };
template<class T> using Z = Y<T>;

int main() {
  X<Y> y;
  X<Z> z;
  z = y; // it fails here
}

Это слегка измененный пример, взятый из стандартного предложения c ++ 11 для псевдонимов шаблонов:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf (См. Стр. 4) Также обратите внимание, что предложение «объявляет y и z одного типа». Поэтому в нашей интерпретации должно быть возможно присвоить (или скопировать конструкцию) z из y.

Однако этот код не компилируется ни с gcc 4.8.1, ни с clang 3.3. Это ошибка в компиляторе или мы неправильно поняли стандарт?

Заранее спасибо, craffael et al;)

Постскриптум Сообщение об ошибке Clang:

error: no viable overloaded '='

note: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'X<template Y>' to 'const X<template Z>' for 1st argument
template<template<class> class TT> struct X { };

note: candidate function (the implicit move assignment operator) not viable: no known conversion from 'X<template Y>' to 'X<template Z>' for 1st argument
template<template<class> class TT> struct X { };

Ответы на вопрос(2)

Ваш ответ на вопрос