C ++ 11-Template-Alias ​​als Template-Template-Argument führt zu anderem Typ?

Wir haben ein merkwürdiges Verhalten bei der Kompilierung des folgenden Quellcodes beobachtet:

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
}

Dies ist ein leicht modifiziertes Beispiel aus dem c ++ 11-Standardvorschlag für Vorlagen-Aliase:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf (Siehe Seite 4) Beachten Sie auch, dass der Vorschlag "y und z als vom gleichen Typ deklariert". In unserer Interpretation sollte es daher möglich sein, z aus y zuzuweisen (oder zu kopieren).

Dieser Code kann jedoch weder mit gcc 4.8.1 noch mit clang 3.3 kompiliert werden. Ist das ein Fehler im Compiler oder haben wir den Standard falsch verstanden?

Vielen Dank im Voraus, craffael et al;)

P.S. Die Clang-Fehlermeldung lautet:

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 { };

Antworten auf die Frage(2)

Ihre Antwort auf die Frage