考虑以下代码:
当我们使用模板别名时会发生什么,如在X中?专业化X是否仍在使用,因为Z是Y的别名? 当我们使用模板别名时,如果模板别名声明解析为一个新的类型系列会发生什么?
#include <iostream>
template <template <typename> class>
struct X {
X() { std::cout << "1"; }
};
template <typename>
struct Y {};
template <typename T>
using Z = Y<T>;
template <>
struct X<Y> {
X() { std::cout << "2"; }
};
int main() {
X<Y> x1;
X<Z> x2;
}
output :21
答案 0 :(得分:3)
别名只是一个别名,并没有引入新的类型系列。实际上,运行代码会打印22
- 这是因为Z
是Y
的别名,因此专精化会被点击两次。
不幸的是,当g ++按预期打印22
时,clang打印21
。我怀疑这是bug #26093所致。实际上,将template
模板转换为普通模板可以防止错误发生:
template <typename>
struct X {
X() { std::cout << "1"; }
};
struct Y {};
using Z = Y;
template <>
struct X<Y> {
X() { std::cout << "2"; }
};
int main() {
X<Y> x1;
X<Z> x2;
}