C ++ 11模板别名作为模板模板参数导致不同的types?

我们在编译以下源代码时观察到一个奇怪的行为:

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是同一types”。 因此,在我们的解释中,应该可以从y分配(或复制构造)z。

但是,这个代码不能用gcc 4.8.1和clang 3.3编译。 这是编译器中的错误还是我们误解了标准?

在此先感谢,craffael等;)

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

目前的标准并没有这样说,但是目的是y和z有相同的types。 有一个开放的核心工作组的问题: http : //wg21.cmeerw.net/cwg/issue1286

我认为你混淆了一个types和模板(或模板别名)。 你有Y ,这是一个模板和Z ,这是另一个。 如果你认为Y == Z ,你错了。 只有将它们转换为types时,这些types才是相同的,例如Y<int>Z<int>是相同的types。 在你的例子中:

 template<class T> struct X { }; template<class> struct Y { }; template<class T> using Z = Y<T>; int main() { X<Y<int>> y; X<Z<int>> z; z = y; // works } 

在你原来的代码中,你用X<Y>X<Z>来引用它们,但是因为YZ不一样,所以X<Y>X<Z>不同的types。