如果模板别名声明解析为新的类型系列?

时间:2016-11-28 09:18:24

标签: c++ c++11 c++14

考虑以下代码:

当我们使用模板别名时会发生什么,如在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

1 个答案:

答案 0 :(得分:3)

别名只是一个别名,并没有引入新的类型系列。实际上,运行代码会打印22 - 这是因为ZY的别名,因此专精化会被点击两次。

不幸的是,当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;
}

wandbox example