我们在follwing源代码的编译中观察到的奇怪的行为:作为模板模板参数的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是同一类型的。”因此,在我们的解释中,应该可以从y分配(或复制构造)z。
但是,这段代码不能用gcc 4.8.1和clang 3.3编译。这是编译器中的错误还是我们误解了标准?
由于提前, craffael等人)
P.S.铛铛错误消息是:
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'是不同的* template-names *,因此它们会产生与'X'不同的实例。见§14.5.7/ 1。 – Xeo