【发布时间】:2016-06-01 02:17:21
【问题描述】:
我们在以下源代码的编译中观察到一个奇怪的行为:
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 等人;)
附: 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是不同的 模板名称,因此它们会产生与X不同的实例化。见§14.5.7/1。
标签: c++ templates c++11 template-templates template-aliases