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>
来引用它们,但是因为Y
和Z
不一样,所以X<Y>
和X<Z>
不同的types。